任何人都可以举个例子来说明这个陈述。我在某个地方读过它,其中提到不建议使用这种指针。
“访问结构成员或多维数组的每个维度的声明边界。”
答案 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
任何访问数组外部元素的尝试都会导致未定义的行为,这会导致程序崩溃,数据损坏,以及其他任何内容。这不是你所谓的不推荐,这就是你所谓的 从不这样做 。