【发布时间】:2019-06-04 11:45:35
【问题描述】:
我正在努力掌握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++ 对我的照顾太多了。我有未定义的行为,现在我知道阻止它们是我的工作。感谢所有回复的人。
【问题讨论】:
-
不要投
malloc()和一般void *,它太冗长,因此不受欢迎 -
内存缓冲区溢出是未定义的行为,这意味着您不知道会发生什么。
malloc不必准确地返回您请求的内存量。它返回至少与您请求一样多的内存,或者什么也不返回。 -
对那些认为这是重复的人感到抱歉。我什至不知道未定义的行为是什么,这就是我的程序正在经历的,所以在创建这样的线程之前很难搜索该术语。相信我,在我在这里问之前,我搜索了很多,并查看了其他 stackoverflow 帖子。无论如何,我很抱歉,感谢所有这么快回复的人,你提供的帮助比你想象的要多:)
-
绝对没有什么可道歉或感到愚蠢的。你已经学会了 C 和你所来自的语言之间的区别,这很棒
-
如果这些答案之一对您有帮助,您应该accept it。
标签: c arrays memory dynamic malloc