unsigned char single[16] = {0};
unsigned short *str_p = PNULL;
short i = 0;
str_p = &single[0];
for(i = 0;i<8;i++)
{
*(str_p+i) = i;
}
昨天面試的時候這個問題沒有答出來,回來之後在自己的環境試了一下也沒發現什麽問題,所以麻煩各位大俠幫忙分析一下。
17 个解决方案
#1
ARM环境???
不太清楚
友情UP一下
不太清楚
友情UP一下
#2
str_p = &single[0];
这里应该要用强制转换吧?否则通不过编译.
str_p = (unsigned short *)&single[0];
这里应该要用强制转换吧?否则通不过编译.
str_p = (unsigned short *)&single[0];
#3
如果single是在奇数地址(unsigned char是1byte长,地址可能是偶数,也可能是奇数),强制转换成unsigned short*后(因unsigned short是2bytes长,应该在偶数地址才行),操作 *(str_p+i) = i;时会有问题。
#4
学习ing
oo(为了名副其实,努力学习oo技术ing)
也就是说,在arm中,unsigned short 的起始地址必须是偶数?
一般的cpu好像有没有这个问题吧.
oo(为了名副其实,努力学习oo技术ing)
也就是说,在arm中,unsigned short 的起始地址必须是偶数?
一般的cpu好像有没有这个问题吧.
#5
不懂arm环境~
但是支持oo(为了名副其实,努力学习oo技术ing)说法~
字节长度不同在相互转化过程中存在地址的奇偶转化~
在转化过程中可能会产生问题~
但是支持oo(为了名副其实,努力学习oo技术ing)说法~
字节长度不同在相互转化过程中存在地址的奇偶转化~
在转化过程中可能会产生问题~
#6
不光ARM,在任何CPU中一般都使用这个限制:
变量的起始地址是变量所占字节的整数倍.
但这并不是必须的,
只是当满足这种情况的时候,CPU对内存的访问速度要快一些,
所以编译器使用了这种优化.
变量的起始地址是变量所占字节的整数倍.
但这并不是必须的,
只是当满足这种情况的时候,CPU对内存的访问速度要快一些,
所以编译器使用了这种优化.
#7
再問一下,如果出現上面的情況(single 的地址为奇数地址),强制类型转换过后,*(str_p+i) = i这样赋值会有什么样的问题?
#8
题目上说了: 如果在ARM的環境下,以下code有可能會造成CPU崩潰.
呵呵,不过有时候这样用,不会造成崩溃的.
呵呵,不过有时候这样用,不会造成崩溃的.
#9
不熟悉ARM,反正在blackfin上会有这个对齐问题——如果数据访问不对齐,系统会抛出一个“不对齐异常”。
#10
shel33(阿松)
再問一下,如果出現上面的情況(single 的地址为奇数地址),强制类型转换过后,*(str_p+i) = i这样赋值会有什么样的问题?
>>会在最后一次使用这个语句时越界.最后一次访问的是:single[15]+single[16] .
再問一下,如果出現上面的情況(single 的地址为奇数地址),强制类型转换过后,*(str_p+i) = i这样赋值会有什么样的问题?
>>会在最后一次使用这个语句时越界.最后一次访问的是:single[15]+single[16] .
#11
不知道是真的么?我怎么从来没有碰到过!我经常一些变量都是从奇数地址开始的,比如结构体中的
__packed struct
{
short i;
char j;
short k;
}
访问i,k要出现一个奇数地址吧,在调试器下看结果确实是不对的,错乱了。但是实际上是对的!
__packed struct
{
short i;
char j;
short k;
}
访问i,k要出现一个奇数地址吧,在调试器下看结果确实是不对的,错乱了。但是实际上是对的!
#12
可能arm情况下,极有可能造成数组下标越界!
#13
同意 oo(为了名副其实,努力学习oo技术ing) ( ) 信誉:110 .
楼上的, 你的在 X86 上当然木问题, ARM 上你的都死了无数次了.
楼上的, 你的在 X86 上当然木问题, ARM 上你的都死了无数次了.
#14
应该是这样的
没试过
没试过
#15
同 oo(为了名副其实,努力学习oo技术ing)
对齐问题有些cpu是强对齐的,如果不对齐的话就会造成崩溃.
对齐问题有些cpu是强对齐的,如果不对齐的话就会造成崩溃.
#16
补充一下,即使cpu是强对齐的,但是也并不一定会有问题。
当这些CPU发现没有对齐的数据时,会发出一个异常,如果这个异常没有被处理,那么就会崩溃了。但是很多操作系统会处理这个异常,并对操作进行调整,当然,代价就是时间。
x86系列CPU没有这个问题,硬件本身会自动处理,但是代价同样是时间。因此,不管在什么CPU有,我们都不应该使用那样的代码。
当这些CPU发现没有对齐的数据时,会发出一个异常,如果这个异常没有被处理,那么就会崩溃了。但是很多操作系统会处理这个异常,并对操作进行调整,当然,代价就是时间。
x86系列CPU没有这个问题,硬件本身会自动处理,但是代价同样是时间。因此,不管在什么CPU有,我们都不应该使用那样的代码。
#17
不懂,顶一下!
#1
ARM环境???
不太清楚
友情UP一下
不太清楚
友情UP一下
#2
str_p = &single[0];
这里应该要用强制转换吧?否则通不过编译.
str_p = (unsigned short *)&single[0];
这里应该要用强制转换吧?否则通不过编译.
str_p = (unsigned short *)&single[0];
#3
如果single是在奇数地址(unsigned char是1byte长,地址可能是偶数,也可能是奇数),强制转换成unsigned short*后(因unsigned short是2bytes长,应该在偶数地址才行),操作 *(str_p+i) = i;时会有问题。
#4
学习ing
oo(为了名副其实,努力学习oo技术ing)
也就是说,在arm中,unsigned short 的起始地址必须是偶数?
一般的cpu好像有没有这个问题吧.
oo(为了名副其实,努力学习oo技术ing)
也就是说,在arm中,unsigned short 的起始地址必须是偶数?
一般的cpu好像有没有这个问题吧.
#5
不懂arm环境~
但是支持oo(为了名副其实,努力学习oo技术ing)说法~
字节长度不同在相互转化过程中存在地址的奇偶转化~
在转化过程中可能会产生问题~
但是支持oo(为了名副其实,努力学习oo技术ing)说法~
字节长度不同在相互转化过程中存在地址的奇偶转化~
在转化过程中可能会产生问题~
#6
不光ARM,在任何CPU中一般都使用这个限制:
变量的起始地址是变量所占字节的整数倍.
但这并不是必须的,
只是当满足这种情况的时候,CPU对内存的访问速度要快一些,
所以编译器使用了这种优化.
变量的起始地址是变量所占字节的整数倍.
但这并不是必须的,
只是当满足这种情况的时候,CPU对内存的访问速度要快一些,
所以编译器使用了这种优化.
#7
再問一下,如果出現上面的情況(single 的地址为奇数地址),强制类型转换过后,*(str_p+i) = i这样赋值会有什么样的问题?
#8
题目上说了: 如果在ARM的環境下,以下code有可能會造成CPU崩潰.
呵呵,不过有时候这样用,不会造成崩溃的.
呵呵,不过有时候这样用,不会造成崩溃的.
#9
不熟悉ARM,反正在blackfin上会有这个对齐问题——如果数据访问不对齐,系统会抛出一个“不对齐异常”。
#10
shel33(阿松)
再問一下,如果出現上面的情況(single 的地址为奇数地址),强制类型转换过后,*(str_p+i) = i这样赋值会有什么样的问题?
>>会在最后一次使用这个语句时越界.最后一次访问的是:single[15]+single[16] .
再問一下,如果出現上面的情況(single 的地址为奇数地址),强制类型转换过后,*(str_p+i) = i这样赋值会有什么样的问题?
>>会在最后一次使用这个语句时越界.最后一次访问的是:single[15]+single[16] .
#11
不知道是真的么?我怎么从来没有碰到过!我经常一些变量都是从奇数地址开始的,比如结构体中的
__packed struct
{
short i;
char j;
short k;
}
访问i,k要出现一个奇数地址吧,在调试器下看结果确实是不对的,错乱了。但是实际上是对的!
__packed struct
{
short i;
char j;
short k;
}
访问i,k要出现一个奇数地址吧,在调试器下看结果确实是不对的,错乱了。但是实际上是对的!
#12
可能arm情况下,极有可能造成数组下标越界!
#13
同意 oo(为了名副其实,努力学习oo技术ing) ( ) 信誉:110 .
楼上的, 你的在 X86 上当然木问题, ARM 上你的都死了无数次了.
楼上的, 你的在 X86 上当然木问题, ARM 上你的都死了无数次了.
#14
应该是这样的
没试过
没试过
#15
同 oo(为了名副其实,努力学习oo技术ing)
对齐问题有些cpu是强对齐的,如果不对齐的话就会造成崩溃.
对齐问题有些cpu是强对齐的,如果不对齐的话就会造成崩溃.
#16
补充一下,即使cpu是强对齐的,但是也并不一定会有问题。
当这些CPU发现没有对齐的数据时,会发出一个异常,如果这个异常没有被处理,那么就会崩溃了。但是很多操作系统会处理这个异常,并对操作进行调整,当然,代价就是时间。
x86系列CPU没有这个问题,硬件本身会自动处理,但是代价同样是时间。因此,不管在什么CPU有,我们都不应该使用那样的代码。
当这些CPU发现没有对齐的数据时,会发出一个异常,如果这个异常没有被处理,那么就会崩溃了。但是很多操作系统会处理这个异常,并对操作进行调整,当然,代价就是时间。
x86系列CPU没有这个问题,硬件本身会自动处理,但是代价同样是时间。因此,不管在什么CPU有,我们都不应该使用那样的代码。
#17
不懂,顶一下!