while(1) {
int ret = scanf("%d", &number);
if (ret != 1)
{
printf("enter valid number\n");
continue;
}
printf("number:%d", number);
if (number >= 1 && number <= 9) {
for (int j = 1; j <= 9; j++) {
printf("%d X %d = %d \n", number, j, number*j);
}
break;
}
else if (number <= 0) {
break;
}
}
$ 这是我的代码。我想要做的是获取大小和输入作为大小,然后将它们全部加倍,并对它们进行排序。
但是当我编译它时,有时它会由于分段错误而崩溃,有时却不会。有时,它说“对象0x7fda70c02730的malloc: *错误:释放的对象的校验和不正确-释放后可能已修改了对象。 * 在malloc_error_break中设置一个断点以进行调试 中止陷阱:6英寸 为什么以及我该怎么办?抱歉,如果我的问题不好,我是c的初学者。
答案 0 :(得分:1)
肯定会导致段错误的一个地方是:
int size;
scanf("%d", &size);
int* a = (int *)malloc(size*sizeof(int));
如果您将其传递给字符而不是适合整数的数字,则将失败,因为scanf不会写入大小。
您必须检查scanf
的返回值,它是成功匹配输入项的数量:
if (scanf("%d", &size) != 1) {
fprintf(stderr, "Supplied size is not a valid number.\n");
return 1;
}
如果realloc
由于未能分配足够的空间而返回NULL,则由于执行以下操作而导致内存泄漏:
int *a = realloc(a, ...);
此模式是错误的,因为将realloc
的返回值分配给要重新分配的数组意味着自a == NULL
起,您将丢失对已分配数组的引用。做:
int *temp = realloc(a, ...);
if (temp == NULL) {
free(a); // Or continue using it ..
} else {
a = temp;
}
您的函数makeDouble
导致堆损坏,因为您正在访问和修改绑定内存。我将realloc() abort: invalid next size
与glibc
一起使用,因此您很可能会破坏运行时已经分配的堆,但不会到达下一页,因此不会出现Segfault和运行时错误。>