簡體   English   中英

釋放大量指針時的分段錯誤

[英]Segmentation fault when free large array of pointers

我的代碼在小文件上運行沒有錯誤。 但是我在大型輸入(百萬行)上遇到了段錯誤。 請查看下面的一些代碼:

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

主要:
...

int main (int argc, char* argv[])
{   
char str[2048]; 
char* v_S = NULL; 
struct set *s_v = NULL;

*計算輸入中的行數

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;

}

在每個malloc之后,您應該檢查malloc是否返回了NULL(這意味着由於堆已滿,無法分配內存)。 如果返回NULL,通常會顯示錯誤消息。 如果仍然要分配內存,則必須在釋放一些已經分配的內存后重試。

由於您的程序針對大型文件而失敗,無需詳細閱讀代碼,因此它一定會失敗,因為它的可用內存不足,並且malloc返回NULL,然后您嘗試將結構元素保存在頂級函數findUnion中的NULL地址處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM