C语言 - 这可能是一个段错误错误,但我不确定?

时间:2016-10-13 12:39:01

标签: c segmentation-fault

大家早上好。我尝试运行以下代码,但它根本无法运行:

void test(u_long *vector, int nLines) {
    int i, j;
    u_long *bkpVector=(u_long *)malloc(0);

    for (i=0; i<=100000; i+=10000) {
        printf("vector of size: i=%d\n\n", i);
        if (i>0) {
            if (bkpVector!=NULL) {
                printf("NOT NULL\n");
                bkpVector=(u_long *)realloc(bkpVector, i*sizeof(u_long));
            }
            else {
                printf("NULL POINTER\n");
                bkpVector= (u_long *)malloc(i*sizeof(u_long));
            }
        }

        //printf("Vector: ");

        for (j=0; j<i; j++) {
            printf("null: %d ", bkpVector==NULL);
            bkpVector[j]=vector[j];
        }
        //printf("\nz\n\n");

        TestBubbleSort(2, bkpVector, i);

        for (j=0; j<i; j++)
            bkpVector[j]=vector[j];
        TestInsertionSort(2, bkpVector, i);

        for (j=0; j<i; j++)
            bkpVector[j]=vector[j];
        TestMergeSort(2, bkpVector, i);

        printf("\n");
    }

    free(bkpVector);
}

它通常在bkpVector[j]=vector[j];行崩溃。你们对可能出现的问题有什么建议吗?有人可以帮忙吗?我是 SO 的新手,请原谅我任何错误。非常感谢你!

1 个答案:

答案 0 :(得分:0)

你的代码中有很多错误。

首先,它隐含地假设vector具有(至少)100000个元素。如果不是这样,那么形式的两个循环

for(j=0; j<i; j++)
        bkpVector[j]=vector[j];

将显示i的任何值超出vector中实际元素数量的未定义行为。

其次,malloc()realloc()可能会失败 - 如果有,则返回NULL指针。您的代码只是像数组一样使用返回的值,而不检查分配是否成功。如果已返回NULL,则执行此操作会导致未定义的行为。

最后,在C语言中这是一个非常糟糕的主意 - 尽管在某些圈子中提倡它 - 转换(也就是类型转换)来自malloc()realloc()的返回值。需要这样做(例如,为了避免来自C编译器的诊断)通常意味着您忘记了#include <stdlib.h>,在这种情况下,通过执行类型转换强制代码编译会导致未定义的行为。 [注意 - 如果你的C编译器实际上是一个C ++编译器,也需要进行类型转换,但是由于各种原因,在C ++中使用malloc()realloc()也是不可取的。]

未定义行为的常见症状是程序崩溃。

虽然并非严格不正确,但malloc(0)通常认为这是一个糟糕的主意。在您的使用中,将bkpVector初始化为NULL就足够了。