【发布时间】:2016-02-14 20:39:34
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main() {
system("clear");
int *pt = malloc(2 * sizeof *pt);
int *tmp = NULL;
int i;
pt[0] = 44;
pt[1] = 9;
printf("pt[0] : %d\n", pt[0]);
printf("pt[1] : %d\n", pt[1]);
tmp = realloc(pt, 3 * sizeof *pt);
if (!tmp) {
printf("merde alors\n");
} else {
pt = tmp;
for (i = 0; i < 5; i++) {
pt[i] = i + 1;
printf("pt[%d] : %d\n", i, pt[i]);
}
}
//the compiler should give me an error here, because I try use an unallocated memory:
printf("pt[%d] : %d\n", i + 8, pt[i + 8]);
free(pt);
return 0;
}
大家好 :) 如您所见,我不明白,我尝试使用未分配的内存,因此我希望从编译器收到一个激进的错误。 原谅我的英语不好。 感谢您的时间 :) Valgrind report :
【问题讨论】:
-
有些东西你只需要调试。它不能显示仅在运行时出现的错误。
-
即使数组是硬编码的,C 编译器也不会阻止您索引超出其范围。对于指针,编译器甚至可能不知道您将在运行时分配多少内存。检查数组索引由您决定。
-
根据您的开发环境,您可能会发现一些调试工具(如 valgrind)很有用。 Valgrind 能够在运行时查明此类错误。 valgrind.org
-
你应该从正确格式化你的代码开始。
-
我可以确认@HenrikCarlqvist 的建议有效;
valgrind报告一次无效写入(第 20 行)和两次无效读取(第 15 和 21 行)。它还指出,在退出时仍有大量内存分配。 (它不喜欢你的行system("clear")根本 - 我必须先删除它。)