看一下下面的C代码。
char * str1 = "hello";
它创建一个分配给只读存储器的char数组,而str1作为第一个元素的指针进行分配。由于是只读的,因此无法在没有分段错误的情况下更改内存。在此语句中:
int * p = 1;
p
现在将分配为1,并且实际上可以将其重新分配给其他值,而不会发生分段错误。为什么是这样?在字符串文字的情况下,仅使内存只读的只是编译器的决定吗?
int * p = 1;
p
现在分配为1。
错误的。p
现在指向内存地址1。
从您没有正确分配从该地址开始的任何内存块开始,这可能会导致各种问题。
更糟糕的是,即使您设法以某种方式在地址1处分配了一个内存块,由于该地址未与之对齐int
(即1不能被整除sizeof int
),因此您的代码也容易发生未对齐的加载/存储操作。
如果您的平台(即指定的编译器+基础HW体系结构)不支持这些操作,则任何通过读取或写入的尝试p
都可能导致:
前者要好于后者,因为在发生总线故障时,至少您会立即意识到问题,而在结果未定的情况下,在程序执行的稍后某个时刻可能会出现一些意想不到的行为,从而使您陷入困境。调试会议之神的怜悯。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句