C:初始化数组的大小+1?
C: Initializing size+1 of an array?
如果我这样做会怎样?
int a[10];
a[10] = 1;
数组元素从 0 到 9,所以我基本上是在初始化一个超出其大小的整数。这会导致错误吗?同样的错误(如果有)也适用于 char 数组吗?我知道您声明 a[size+1] 为空值保留一个元素,但仅此而已...
编辑:这会导致缓冲区溢出以外的任何其他情况吗?
行为未定义,可能从 "nothing happens" 到 "a solid crash a few moment later" 到 "totally weird Heisenbug"。它也很可能受到编译器标志的影响。
但真正发生的是将数组放在堆栈上,然后写入其下方的 "something else"。 "something else" 可能有很大差异,只有查看生成的汇编代码才能确定。
[int a[10]]
[以前的变量,甚至可能 return 地址]
简而言之:不要这样做,并尝试使用启用堆栈检查和警告的编译器设置。
如果您碰巧使用了最近的 gcc 或 clang,您应该会收到一条警告,指出您访问越界,您还可以启用 "sanitizers",它会在程序运行时警告此类访问。
如果我这样做会怎样?
int a[10];
a[10] = 1;
数组元素从 0 到 9,所以我基本上是在初始化一个超出其大小的整数。这会导致错误吗?同样的错误(如果有)也适用于 char 数组吗?我知道您声明 a[size+1] 为空值保留一个元素,但仅此而已...
编辑:这会导致缓冲区溢出以外的任何其他情况吗?
行为未定义,可能从 "nothing happens" 到 "a solid crash a few moment later" 到 "totally weird Heisenbug"。它也很可能受到编译器标志的影响。
但真正发生的是将数组放在堆栈上,然后写入其下方的 "something else"。 "something else" 可能有很大差异,只有查看生成的汇编代码才能确定。
[int a[10]] [以前的变量,甚至可能 return 地址]
简而言之:不要这样做,并尝试使用启用堆栈检查和警告的编译器设置。 如果您碰巧使用了最近的 gcc 或 clang,您应该会收到一条警告,指出您访问越界,您还可以启用 "sanitizers",它会在程序运行时警告此类访问。