c macOS中的分段错误;有时,有时不

时间:2018-10-06 15:41:27

标签: c segmentation-fault malloc

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的初学者。

1 个答案:

答案 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 sizeglibc一起使用,因此您很可能会破坏运行时已经分配的堆,但不会到达下一页,因此不会出现Segfault和运行时错误。