首页 > 解决方案 > 如果我在 calloc 分配的内存之外设置一个值会发生什么?

问题描述

考虑以下:

int* x = calloc(3,sizeof(int));
x[3] = 100;

它位于函数内部。

编译和运行程序时我没有收到任何错误,但是当我使用 valgrind 运行它时,我得到一个“大小为 4 的无效写入”。

我知道我正在访问我使用 calloc 分配的内存位置之外的内存位置,但我试图了解实际发生的情况。

堆栈中的某个地址(?)是否仍然具有值 100?因为肯定有比我用 calloc 分配的内存更多的可用内存。valgrind 错误是否更像是“嘿,你可能不是故意的”?

标签: cvalgrindcalloc

解决方案


我知道我正在访问我使用 calloc 分配的内存位置之外的内存位置,但我试图了解实际发生的情况。

“实际发生的事情”没有明确定义;这完全取决于被覆盖的内容。只要您不覆盖任何重要内容,您的代码就会预期运行。

您最终可能会破坏动态分配的其他数据。你最终可能会破坏一些堆簿记。

该语言不对数组访问强制执行任何类型的边界检查,因此如果您读取或写入超出数组末尾,则无法保证会发生什么。


推荐阅读