尝试在 C 中使用 realloc 扩展数组时出现分段错误错误 [关闭]

Posted

技术标签:

【中文标题】尝试在 C 中使用 realloc 扩展数组时出现分段错误错误 [关闭]【英文标题】:Segmentation fault error while trying to expand array with realloc in C [closed] 【发布时间】:2016-05-23 13:22:43 【问题描述】:

我的代码运行良好,最多 3 次迭代就可以得到正确的结果。但是,当我尝试运行以下代码时,在 3 次迭代后出现分段错误错误:

int addNode(double* distNewNode,int placeCount, int* phi,double* lambda)

    int i ;
    int nextPlaceCount = placeCount+1;
    //int nodeCount = placeCount -1;

    phi= realloc(phi,nextPlaceCount*sizeof(int));
    lambda = realloc(lambda,nextPlaceCount*sizeof(double)); //This line throws the error

    phi[placeCount] = placeCount;
    lambda[placeCount] = DBL_MAX;
    for (i = 0;i < placeCount; i++)
        if (lambda[i] >= distNewNode[i])
    
            if (lambda[i] <= distNewNode[phi[i]])
                distNewNode[phi[i]] = lambda[i];
                lambda[i] = distNewNode[i];
                phi[i] = placeCount;
    
        else if (distNewNode[i] < distNewNode[phi[i]])
            distNewNode[phi[i]] = distNewNode[i];

    for (i = 0;i < placeCount;i++)
        if(lambda[i] >= lambda[phi[i]] )
            phi[i] = placeCount;

    return 1;

下面是我调用 addNode() 函数的方法:

    int main()

    //Create distMat here
    int* phi;
    phi = (int*)malloc(1);
    phi[0] = 1;
    //phi[1] = 1;

    double* lambda;
    lambda = (double*)malloc(1);
    //lambda[0] = 1.2;
    lambda[0] = DBL_MAX;

    int isNodeAdded;

        for (int  placeCount=0; placeCount < 10;placeCount++)
    
        double* temp =(double*) malloc(placeCount);
        for (int j= 0;j < placeCount ;j++)
        
            temp[j] = distMat[placeCount][j];

        
        isNodeAdded = addNode(temp,placeCount,phi,lambda);
        cout << "isNodeAdded: "<<isNodeAdded << endl;
        free(temp);

        for (int i=0;i < placeCount ;i++)
        
            printf("Node= %d Pi = %d Lambda = %f \n",i,phi[i],lambda[i]);
        
    

我的输出是:

isNodeAdded: 1
isNodeAdded: 1
Node= 0 Pi = 1 Lambda = 1.200000 
isNodeAdded: 1
Node= 0 Pi = 1 Lambda = 1.200000 
Node= 1 Pi = 2 Lambda = 3.400000 
isNodeAdded: 1
The program has unexpectedly finished.

【问题讨论】:

这不是 C !见How to Ask main函数是C++,而addNode()函数是C。 除非你用C编译器编译,否则不是!阅读我提供的链接!并检查关键函数的结果! 你知道realloc转换成addNode不会修改main函数中的指针.....? @LPs 前 3 次迭代会发生变化 【参考方案1】:

问题是你传递参数phi按值,这意味着它的值被复制到函数局部变量phi中,和所有局部变量phi一样出去函数返回时的作用域,并且函数内部对它的所有更改都将丢失。

如果函数 addNode 在 C 源文件中,那么你不能通过引用传递 因为它不受 C 支持,所以你必须通过传递一个指针来模拟它指针变量,即在 main 函数中,您需要传递 &amp;phi,并将函数修改为采用 int **phi,并根据需要适当取消引用变量。

另一方面,如果 addNode 在 C++ 源文件中,那么您只需将参数更改为 int *&amp;phi,您将拥有一个引用变量,它将引用作为参数传递的原始变量来自main 函数。

你还有另一个问题会在main函数中给你未定义的行为:

phi = (int*)malloc(1);
phi[0] = 1;

在这里分配 一个 字节,并将其用作int,通常为四个字节。


在不相关的注释中,您不应该将realloc 的结果重新分配给您作为参数传递的变量。想想如果realloc 返回NULL 会发生什么。原来的指针仍然有效,但是如果你重新分配它,你会丢失指针,从而导致内存泄漏。

【讨论】:

我这样编辑了那部分:int* phi; phi = (int*)malloc(1*sizeof(int)); phi[0] = 1; 如果我将其定义为int** phi ,那么phi[0] 会是什么?因为我不能再分配整数了 @Bhoke 您有一个指向原始变量的指针,要访问它,您需要取消引用您的指针,如(*phi)[0]。请注意,这只能在addNode 函数中 完成。在main 函数中,您应该仍然有一个一级指针,即int *phi @Bhoke 请搜索emulating pass by reference in c了解更多详情和信息。

以上是关于尝试在 C 中使用 realloc 扩展数组时出现分段错误错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

windows安装xampp时出现,unable to realloc xxxxxxxx bytes

尝试声明大数组时出现分段错误和核心转储[重复]

C - 当我尝试将结构从数组复制到结构中包含的数组时出现问题

c中的memset struct数组时出现分段错误

尝试初始化结构数组时出现段错误

使用valgrind时出现奇怪的错误?也许是一个错误?