访问结构成员或多维数组的每个维度的声明边界

时间:2011-03-05 07:40:17

标签: c pointers

任何人都可以举个例子来说明这个陈述。我在某个地方读过它,其中提到不建议使用这种指针。

“访问结构成员或多维数组的每个维度的声明边界。”

2 个答案:

答案 0 :(得分:1)

我不知道该引用的来源,但我可以尝试提供一些解释。

创建数组(或malloc)时,编译器(或libc)会在堆栈(或堆)上分配空间来存储该数据。其他数据可能存储在该数据周围,并且写入大于所分配数据的索引可能会破坏该数据。

char x[5];
int y;
short z;

Raw memory: (just an example, likely to vary)
         00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
b0000000 xx xx xx xx xx -- -- -- yy yy yy yy zz zz -- --

其中xx,yy和zz相应地对应于x,y和z变量,并且 - 是添加填充。当您引用x[4]时,它对应于地址x+sizeof(x[0])*4(注意不是C语法:正常算术而不是指针算术),即b0000004。当您写信至x[8]时,这与b0000008相对应,y位于此示例中x[8]。写入y,实际上会导致char x[5]; int y; short z; y = 0x12345678; x[8] = 0xad; x[9] = 0xde; printf("%#x\n", y); /* 0x1234dead is printed ?!? */ 的值发生变化!

理论上可能发生什么(但未定义会发生什么):

{{1}}

答案 1 :(得分:0)

这归结为在数组边界外访问

int array[100];
int* pointer = array;
*(pointer + 100) = 0; // undefined behavior - the last valid index is 99
int value = *(pointer + 200); //undefined behavior just as well

任何访问数组外部元素的尝试都会导致未定义的行为,这会导致程序崩溃,数据损坏,以及其他任何内容。这不是你所谓的不推荐,这就是你所谓的 从不这样做