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

C 访问结构成员或多维数组的每个维度的声明边界之外,c,pointers,C,Pointers,谁能给我举个例子来说明这一点。我在某个地方读到过,其中提到不建议使用这种指针 “访问结构成员或多维数组的每个维度的声明边界外。”这归结为仅访问数组边界外的内容: 任何试图访问数组外部元素的行为都会导致未定义的行为,可能会导致程序崩溃、数据损坏或其他任何情况。这不是你所说的“不推荐”,这是你所说的“永远不要那样做”我不知道这句话是从哪里来的,但我可以试着给出一些解释 创建数组(或malloc)时,编译器(或libc)在堆栈(或堆)上分配空间来存储该数据。其他数据段可能存储在该数据周围,写入大于分配

谁能给我举个例子来说明这一点。我在某个地方读到过,其中提到不建议使用这种指针

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

这归结为仅访问数组边界外的内容:


任何试图访问数组外部元素的行为都会导致未定义的行为,可能会导致程序崩溃、数据损坏或其他任何情况。这不是你所说的“不推荐”,这是你所说的“永远不要那样做”

我不知道这句话是从哪里来的,但我可以试着给出一些解释

创建数组(或
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;

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 -- --
char x[5];
int y;
short z;

y = 0x12345678;
x[8] = 0xad;
x[9] = 0xde;

printf("%#x\n", y);
/* 0x1234dead is printed ?!? */