2012-01-22 644 views
0

我有使用malloc分配內存的問題。 這裏是從我的代碼的片段:malloc函數崩潰

printf("DEBUG %d\n",L); 
    char *s=(char*)malloc(L+2); 
    if(s==0) 
    { 
     printf("DEBUGO1"); 
    } 
    printf("DEBUGO2\n"); 

它輸出「DEBUG 3」,然後一個錯誤MSGBOX出現此消息:

在「0x0000000」引用內存0x7c9369aa指令。 內存無法讀取

對我來說這樣的行爲很奇怪。 這裏有什麼可能是錯誤的?

該應用程序是單線程的。

我使用的是內置的代碼MinGW的C編譯器::塊10.05

我所能提供的所有代碼,如果需要的話。 謝謝。

UPD1: 有更多的代碼:

char *concat3(char *str1,char *str2,char *str3) 
{ 
    /*concatenate three strings and frees the memory allocated for substrings before*/ 
    /* returns a pointer to the new string*/ 

    int L=strlen(str1)+strlen(str2)+strlen(str3); 
    printf("DEBUG %d\n",L); 
    char *s=(char*)malloc(L+2); 
    if(s==0) 
    { 
     printf("DEBUGO1"); 
    } 
    printf("DEBUGO2\n"); 
    sprintf(s,"%s%s%s",str1,str2,str3); 
    free(str1); 
    free(str2); 
    free(str3); 
    return s; 
} 

UPD2: 看來問題比我想象的更復雜。只是如果有人有足夠的時間來幫助我:

這裏是所有的代碼

Proj

(這是代碼::塊10.05的項目,但你可以編譯源代碼,沒有一個IDE,它是沒有任何庫純C):

呼叫的程序作爲 「cbproj.exe s.pl」(該s.pl文件是在arhive的根)

和可能看到它崩潰時它稱之爲功能在「parser.tab.c」(其中函數concat3被寫入)的第113行的「malloc」上。

我在教育採購項目,你可以使用源代碼沒有任何限制。

UPD3: 的問題是,它沒有分配足夠的內存在程序中的字符串中的一個,但它似乎直到下一個malloc的工作。呵呵,我討厭C現在:) 我同意關於糟糕的編碼風格的評論,需要在這方面提高自己。

+0

您的代碼不完整;什麼是'L'? –

+4

錯誤在別處。請發佈相關代碼。 –

+0

你應該用NULL來比較而不是0 – BlackBear

回答

1

與此完全相同的代碼的問題是,當malloc失敗,你不從函數返回,但在sprintf呼叫作爲緩衝區使用NULL指針進一步。

我也建議你釋放內存分配str1str2str3以外的功能,否則你可能會讓自己陷入麻煩的其他地方。


編輯:運行在Valgrind的程序,(在parser.tab.c)揭示了兩個真正問題後:

yyuserAction

char *applR=(char*)malloc(strlen(ruleName)+7); 
sprintf(applR,"appl(%s).",ruleName); 

+7不足因爲在字符串的末尾還需要\ 0 char的空間。使它成爲+8幫助。

SplitList

char *curstr=(char*)malloc(leng); 

有分配零個字節的可能性。 leng + 1有幫助。

上述變化後,一切運行良好(如果可以這樣說,因爲我不會計算內存泄漏)。

+0

謝謝,applR的第一個問題是實際問題。修復後,一切正常。你對內存泄漏也是正確的,我需要學習一些工具(比如valgrind?)來修復所有這些工具。 –

1

從錯誤消息看,它實際上看起來像你的if聲明並不完全是你在這裏發佈的內容。這表明,你的if語句可能是這樣的:

if(s=0) { 
} 

注單=(分配),而不是==(平等)。

+0

是的,它似乎是唯一可能的答案,但一切都與我寫的一樣。我已將整個項目附加到我的帖子中。 –

0

您不能在malloc,callocrealloc未創建的指針上使用free。從手冊頁:

free()釋放由ptr指向的內存空間,該內存空間必須先前通過調用malloc(),calloc()或realloc()返回。否則,或者如果釋放(ptr)之前已被調用,則會發生未定義的行爲。如果ptr爲NULL,則不執行任何操作。

+0

謝謝,但我使用strdup創建的指針的「免費」,它使用malloc作爲分配內存 –