C 释放大指针数组时的分段错误

C 释放大指针数组时的分段错误,c,arrays,pointers,malloc,free,C,Arrays,Pointers,Malloc,Free,我的代码在小文件上运行时没有错误。但我在大的输入(百万行)上得到了segmfault。请参阅以下部分代码: element* unionFind(void *data) { element *retVal = NULL; retVal = (element *)malloc(sizeof(element)); retVal->data = data; retVal->rank = 0; retVal->leader = retVal;

我的代码在小文件上运行时没有错误。但我在大的输入(百万行)上得到了segmfault。请参阅以下部分代码:

element* unionFind(void *data)
{
    element *retVal = NULL;
    retVal = (element *)malloc(sizeof(element));
    retVal->data = data;
    retVal->rank = 0;
    retVal->leader = retVal;
    return retVal;
}
Main:

*计算输入中的行数

long *v_L = (long *)malloc(sizeof(long)*ct_lines);
element **v = malloc(sizeof(element)*ct_lines) ;

while(fgets(str,sizeof(str),fp) != NULL)
{
     v_S = strtok(str,":");        

     v_L[i] = atol(v_S);
         v[i] = unionFind(&v_L[i]);
     s_v = add_vertex(v_L[i], v[i]);

     i++;
}

fclose(fp);

for (i = 0; i < ct_lines; i++) //Here segfault
    {
    free(v[i]); v[i] = NULL;
    }

free(v); v = NULL;
free(v_L); v_L = NULL;

}
long*v_L=(long*)malloc(sizeof(long)*ct_行);
元件**v=malloc(元件尺寸)*ct\U线);
while(fgets(str,sizeof(str),fp)!=NULL)
{
v_S=strtok(str,“:”);
v_L[i]=环礁(v_S);
v[i]=unionFind(&v_L[i]);
s_v=添加_顶点(v_L[i],v[i]);
i++;
}
fclose(fp);
对于(i=0;i
在每次malloc之后,您应该检查malloc是否返回NULL(这意味着无法分配内存,因为堆已满)。如果返回NULL,通常会打印错误消息。如果仍然要分配内存,则必须在释放一些已分配的内存后重试


由于您的程序无法读取大文件,不需要读取详细代码,因此它一定是失败了,因为它的可用内存不足,malloc返回NULL,然后您试图在顶部函数findUnion的NULL地址保存结构元素。

旁注:当您编写
retVal=(element*)malloc(sizeof(element))
,您正在重复
retVal
的类型,这不好。特别是如果你决定改变它的类型。malloc的用法是:
type*var=malloc(size*sizeof(*var))更短、更清晰、更不容易出错。
元素**v=malloc(元素大小)*ct\u行)应该是
元素**v=malloc(sizeof(元素*)*ct\u行)@newacct就是这样!!非常感谢@内莉:但这不应该是个问题,因为
元素
(一个包含多个东西的结构)比
元素*
(一个指针)更重要,所以您应该分配太多的空间,这不应该导致崩溃
long *v_L = (long *)malloc(sizeof(long)*ct_lines);
element **v = malloc(sizeof(element)*ct_lines) ;

while(fgets(str,sizeof(str),fp) != NULL)
{
     v_S = strtok(str,":");        

     v_L[i] = atol(v_S);
         v[i] = unionFind(&v_L[i]);
     s_v = add_vertex(v_L[i], v[i]);

     i++;
}

fclose(fp);

for (i = 0; i < ct_lines; i++) //Here segfault
    {
    free(v[i]); v[i] = NULL;
    }

free(v); v = NULL;
free(v_L); v_L = NULL;

}