[英]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形標記您的所有答案,以表明它已經解決了該問題,因為您一直以來都很有幫助。
深入研究后,我對代碼進行了兩項更改,到目前為止,一切似乎都可以正常進行:
再次感謝大家向我展示代碼中遇到的其他問題。
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.