c - 使用 malloc 给了我比预期更多的内存?
问题描述
我正在尝试掌握malloc
,到目前为止,在测试和使用它时,我大多会得到意想不到的结果。
int main(int argc, char** argv)
{
int size = 10;
int *A;
A = (int *)malloc(size * sizeof(int));
for (int i = 0; i < 10000; i++)
{
A[i] = i;
}
for (int i = 0; i < 10000; i++)
{
printf("%d) %d\n", i, A[i]);
}
}
例如,使用上面的示例代码,代码运行没有错误。即使我只分配A
了 10 * int,所以我希望循环在遇到错误之前只运行 10 次。如果我将循环增加到大约 30-40k,则会遇到分段错误。但是,如果我将大小增加到循环量,它总是会像预期的那样工作。所以我知道如何避免错误.. 有点,我只是希望有人可能会很好地解释为什么会这样。
编辑:原来我不明白 C 没有检测到越界,Java 和 C++ 对我的照顾太多了。我有未定义的行为,现在知道阻止它们是我的工作。感谢所有回复的人。
解决方案
C 不需要对数组访问执行任何边界检查。它可以让您在没有任何警告或错误的情况下读/写过去。
您通过在分配的内存结束后读取和写入来调用未定义的行为。这意味着您的程序的行为无法预测。它可能会崩溃,它可能会输出奇怪的结果,或者它可能(如您的情况)似乎正常工作。
程序会崩溃并不意味着它会崩溃。
推荐阅读
- python - 无法连接到带有 SQLalchemy、操作错误和接口错误的 mssql 服务器
- r - 如何编写高效的代码来导入多个 SAS 文件
- css - 如何借助变量将 HTML 属性值动态传递到量角器中的 CSS 选择器中?
- java - Java版本命令给出不同的结果
- azure - 天蓝色表存储:实体过滤器查询不会终止
- microsoft-cognitive - Microsoft-Cognitive 错误 429 既不是由频率也不是由大小引起的
- c# - 如何在c#中将.wav文件分成两部分
- react-native - React Native - 如何将捕获的图像存储在其他文件夹而不是图片文件夹
- android - Kotlin 中的数据绑定 + 房间。如何在 Kotlin 中绑定数据类?
- java - 无法使用 LibVLC 在 android 应用上加载 m3u 播放列表