我正在撰寫一個簡單的編譯器只是為了好玩,我希望每一行都有適當的縮進。
所以我寫了一個函式,它根據數字回傳一個帶有一些空格的字符陣列。
問題是在生成陣列時,在檔案中寫入或只是列印時,某些字符似乎是錯誤的。我認為它們是從帶有一些資訊的記憶體位置中獲取的,因為我看到了檔案路徑的片段。
我做了一個有同樣問題的示例代碼
int num = 0;
char *tabs;
for (; num < 20; num )
{
tabs = malloc(num);
memset(tabs, '-', num);
printf("%d | %sEND\n", num, tabs);
}
(我想這不是最好的代碼,但我是 C 的初學者)
輸出:
0 | ?c?END
1 | -s?END
2 | --?END
3 | ---END
4 | ----END
5 | -----END
6 | ------END
7 | -------END
8 | --------P??END
9 | ---------??END
10 | ----------?END
11 | -----------END
12 | ------------END
13 | -------------END
14 | --------------END
15 | ---------------END
16 | ----------------END
17 | -----------------END
18 | ------------------END
19 | -------------------END
每次運行程式時字符都不同。
如果我使用 for 回圈而不是memset來設定每個字符,結果將是相同的。
我讀到 memset 可以解決問題,但我沒有。
uj5u.com熱心網友回復:
使用memset后動態分配的字符陣列tabs
tabs = malloc(num);
memset(tabs, '-', num);
不包含字串。
因此%s,printf在對該陣列的呼叫中使用轉換說明符會呼叫未定義的行為。
你可以寫
tabs = malloc(num 1);
memset(tabs, '-', num);
tabs[num] = '\0';
另一種方法是通過以下方式更改呼叫 pf printf
printf("%d | %.*sEND\n", num, num, tabs);
請注意,for 回圈會產生大量記憶體泄漏,因為回圈每次迭代中分配的記憶體都沒有釋放。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341539.html
