簡體   English   中英

C程序崩潰,malloc行上的“ 0xb7e88a81”沒有可用的源(Eclipse)

[英]C Program crash “No source available for ”0xb7e88a81“” on malloc line (Eclipse)

我有一個函數,它接受一個字符串並切掉它的某些部分。

該函數執行了幾次操作,直到突然,同一行malloc行運行正常,並崩潰,並沒有“ 0xb7e88a81”錯誤可用的源。

試圖清除所有內容,以確保我沒有發送NULL長度或任何長度,但仍然沒有運氣。

它至少工作了一次(調試過),但是在第二或第三次迭代中崩潰了。

char *removeOffsetFromLabel (char *label) {
    char* labelWithoutOffset;
    int i;

    labelWithoutOffset = malloc(strlen(label));
   ........

崩潰發生在malloc行上(嘗試移動到下一行時)。

strlen(label)= 7(選中)

有任何想法嗎 ? 我在Eclipse(Ubuntu)上使用GCC編譯器。

根據FoggyDay的要求,這是整個功能:

char *removeOffsetFromLabel (char *label) {
char* labelWithoutOffset;
int i;

labelWithoutOffset = (char*)malloc(strlen(label) + 1);
i = 0;
while (label[i] != '\0' && label[i] != OPENING_BRACKET_ASCII_CODE) {
    labelWithoutOffset[i] = label[i];
    i++;
}
labelWithoutOffset[i] = '\0';
return labelWithoutOffset;
}

在再次調用它之前,我確實在函數外部釋放了“ labelWithoutOffset”。

希望我能用V形標記您的所有答案,以表明它已經解決了該問題,因為您一直以來都很有幫助。

深入研究后,我對代碼進行了兩項更改,到目前為止,一切似乎都可以正常進行:

  1. 刪除了在已釋放的指針上使用的兩個“自由”命令(愚蠢的錯誤)
  2. 每次空閑后添加“ pointer = NULL”(為安全起見)

再次感謝大家向我展示代碼中遇到的其他問題。

StackOverflow搖滾!

1)如上所述,“ malloc()” 必須為 “ strlen()+ 1”:

   char *removeOffsetFromLabel (char *label) {
      char* labelWithoutOffset = (char *)malloc(strlen(label)+1);

2)由於這不能解決問題,因此我們還需要查看以下內容:

a)當我們調用strlen()時,“標簽”有效嗎?

b)您是否有任何代碼可能在其他地方覆蓋“ labelWithoutOffset”-在一個調用中分配它之后,再在另一個調用中再次分配它之前?

建議:

a)添加以下代碼(或者更好的是,在調試器中查看“標簽”):

   char *removeOffsetFromLabel (char *label) {
      fprintf (STDERR, "label=%s\n", label);
      fprintf (STDERR, "strlen(label)=%d\n", strlen(label);
      char* labelWithoutOffset = (char *)malloc(strlen(label)+1);

b)從“ removeOffsetFromLabel()”中發布更多代碼-也許我們可以看到該變量可能在“被踩踏”的位置。

PS:如果您有雄心壯志,請查看我上面的Valgrind教程的鏈接。

但是對於“快速結果”,請嘗試建議1)和2); 讓我們知道如何進行。

如果strlen(label)確實為7,則不是strlen()而是崩潰的malloc()本身。

如果malloc()崩潰,則可能意味着malloc()的內部整理工作在更早/其他地方被破壞(由於指針發瘋了)。

這樣的錯誤很難(最難發現),因為您無法分辨出它們在哪里,因為崩潰很可能在起因之后發生。

您可能需要研究Valgrind的用法。

從頭開始。

我不明白那里的任何函數類型,但據我所知malloc(); 和字符串,因為label是一個數組,您應該像這樣發送它

void funcCall(int *)
main()
{
    funcCall(label)
}
funcCall(int funcLabel[])
{

}

希望這可以幫助。

暫無
暫無

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

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