C 释放大指针数组时的分段错误
我的代码在小文件上运行时没有错误。但我在大的输入(百万行)上得到了segmfault。请参阅以下部分代码: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;
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;
}