面試時遇到的一個問題,請大家幫忙解惑

时间:2021-11-07 16:03:00
如果在ARM的環境下,以下code有可能會造成CPU崩潰,爲什麽?

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一下

#2


str_p = &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好像有没有这个问题吧.

#5


不懂arm环境~
但是支持oo(为了名副其实,努力学习oo技术ing)说法~
字节长度不同在相互转化过程中存在地址的奇偶转化~
在转化过程中可能会产生问题~

#6


不光ARM,在任何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] .

#11


不知道是真的么?我怎么从来没有碰到过!我经常一些变量都是从奇数地址开始的,比如结构体中的
__packed struct
{
short i;
char j;
short k;
}

访问i,k要出现一个奇数地址吧,在调试器下看结果确实是不对的,错乱了。但是实际上是对的!

#12


可能arm情况下,极有可能造成数组下标越界!

#13


同意 oo(为了名副其实,努力学习oo技术ing) ( ) 信誉:110 .

楼上的, 你的在 X86 上当然木问题, ARM 上你的都死了无数次了.

#14


应该是这样的

没试过

#15


同  oo(为了名副其实,努力学习oo技术ing) 

对齐问题有些cpu是强对齐的,如果不对齐的话就会造成崩溃.

#16


补充一下,即使cpu是强对齐的,但是也并不一定会有问题。
当这些CPU发现没有对齐的数据时,会发出一个异常,如果这个异常没有被处理,那么就会崩溃了。但是很多操作系统会处理这个异常,并对操作进行调整,当然,代价就是时间。
x86系列CPU没有这个问题,硬件本身会自动处理,但是代价同样是时间。因此,不管在什么CPU有,我们都不应该使用那样的代码。

#17


不懂,顶一下!

#1


ARM环境???
不太清楚

友情UP一下

#2


str_p = &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好像有没有这个问题吧.

#5


不懂arm环境~
但是支持oo(为了名副其实,努力学习oo技术ing)说法~
字节长度不同在相互转化过程中存在地址的奇偶转化~
在转化过程中可能会产生问题~

#6


不光ARM,在任何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] .

#11


不知道是真的么?我怎么从来没有碰到过!我经常一些变量都是从奇数地址开始的,比如结构体中的
__packed struct
{
short i;
char j;
short k;
}

访问i,k要出现一个奇数地址吧,在调试器下看结果确实是不对的,错乱了。但是实际上是对的!

#12


可能arm情况下,极有可能造成数组下标越界!

#13


同意 oo(为了名副其实,努力学习oo技术ing) ( ) 信誉:110 .

楼上的, 你的在 X86 上当然木问题, ARM 上你的都死了无数次了.

#14


应该是这样的

没试过

#15


同  oo(为了名副其实,努力学习oo技术ing) 

对齐问题有些cpu是强对齐的,如果不对齐的话就会造成崩溃.

#16


补充一下,即使cpu是强对齐的,但是也并不一定会有问题。
当这些CPU发现没有对齐的数据时,会发出一个异常,如果这个异常没有被处理,那么就会崩溃了。但是很多操作系统会处理这个异常,并对操作进行调整,当然,代价就是时间。
x86系列CPU没有这个问题,硬件本身会自动处理,但是代价同样是时间。因此,不管在什么CPU有,我们都不应该使用那样的代码。

#17


不懂,顶一下!