负索引; 在释放时给出错误

jay*_*ynp -2 c malloc free

在C中,我在编写以下示例时遇到错误:

int *pointer;
int i = 0;
pointer = malloc(10 * sizeof(int));
pointer[i - 1] = 4;
Run Code Online (Sandbox Code Playgroud)

显然i是负面指数pointer.

即使错误的片段内存被更改,为什么只在free(pointer)[稍后在代码中] 触发错误?错误是:double free or corruption (out).

编辑:使用的编译器是 gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

PQu*_*inn 5

大多数(如果不是所有)内存管理器(例如:malloc)都会在您请求的内存周围分配额外的数据.这个额外的工作是通过将一些自己的数据添加到分配中来帮助内存管理器管理各种分配.当你做了负面索引时,你覆盖了这些额外的数据.它本身并不是无效的内存,因此CPU无法防范它,但是当malloc看到它的数据已被堵塞时,它确实会抱怨.这将发生在free()上.

  • 这个答案中缺少的关键工作是:**未定义的行为(UB)**.访问不属于您的内存位置是UB.访问超出内存位置时发生UB,之后发生的事情纯粹是未定义的.它可能会也可能不会崩溃或刻录光盘.没有行为得到保证. (3认同)