c - 如果我在 calloc 分配的内存之外设置一个值会发生什么?
问题描述
考虑以下:
int* x = calloc(3,sizeof(int));
x[3] = 100;
它位于函数内部。
编译和运行程序时我没有收到任何错误,但是当我使用 valgrind 运行它时,我得到一个“大小为 4 的无效写入”。
我知道我正在访问我使用 calloc 分配的内存位置之外的内存位置,但我试图了解实际发生的情况。
堆栈中的某个地址(?)是否仍然具有值 100?因为肯定有比我用 calloc 分配的内存更多的可用内存。valgrind 错误是否更像是“嘿,你可能不是故意的”?
解决方案
我知道我正在访问我使用 calloc 分配的内存位置之外的内存位置,但我试图了解实际发生的情况。
“实际发生的事情”没有明确定义;这完全取决于被覆盖的内容。只要您不覆盖任何重要内容,您的代码就会按预期运行。
您最终可能会破坏动态分配的其他数据。你最终可能会破坏一些堆簿记。
该语言不对数组访问强制执行任何类型的边界检查,因此如果您读取或写入超出数组末尾,则无法保证会发生什么。
推荐阅读
- javascript - FS 替代反应
- arrays - 数组中多个 if 语句的 VBA 代码
- javascript - 使用 jQuery 或 JavaScript 从数组中提取数据
- c# - c# 的排序集如何与自定义对象一起使用?
- arrays - 类型“() => void”上不存在属性“push”。如何解决 Typescript Angular 10 中的此错误?
- rally - 有没有办法在 Rally 中查询投资组合项目状态(颜色)?
- asp.net-core - IIS 'Access-Control-Allow-Origin' 标头仅适用于 ASP.NET 3.1 上的图像上传
- python - 如何在python中出现异常后继续处理而不中止
- javascript - 如何在 JavaScript 中移动前面的图像而不影响后面的图像?
- python - 熊猫中count_value(0)与count_value(1)之间的区别