您已經爲30個指針分配了空間,但您尚未初始化它們以指向任何有意義的地方。除非您在函數之外聲明數組,否則數組中的每個元素都將包含一些隨機位串,這些隨機位串可能對應於可寫內存位置,也可能不對應。如果我們畫了一幅畫,它看起來像這樣(所有地址都是無中生有的,不承擔此相對應的任何真正的架構):
Item Address 0x00 0x01 0x02 0x03
---- ------- ---- ---- ---- ----
ptr 0xbbc81230 0x?? 0x?? 0x?? 0x??
0xbbc81234 0x?? 0x?? 0x?? 0x??
0xbbc81238 0x?? 0x?? 0x?? 0x??
...
0xbbc812a8 0x?? 0x?? 0x?? 0x??
其中0x??
代表一個隨機字節值。對於你所描述的行爲,每個隨機值只是發生在指向可寫內存,並寫在那裏存儲的任何東西只是發生沒有任何直接的不良影響。
壞朱朱:它看起來像你的代碼工作正常,而實際上它的表現非常糟糕,並可能導致在你的程序有些討厭的運行在其他地方的問題,是一個痛苦的調試。
您需要明確設置ptr
陣列的每個元素,以在嘗試通過它寫入之前指向有效的內存位置。
假設我們添加以下代碼:
ptr[0] = malloc(strlen("foo") + 1);
strcpy(ptr[0], "foo");
ptr[1] = malloc(strlen("bar") + 1);
strcpy(ptr[1], "bar");
我們動態地分配一些額外的內存來容納一對夫婦的字符串,並將其存儲在指向這些新緩衝區ptr[0]
和ptr[1]
。
我們的圖片現在看起來是這樣的:
Item Address 0x00 0x01 0x02 0x03
---- ------- ---- ---- ---- ----
0x80ff0000 'f' 'o' 'o' 0x00
...
0x80ffcdc0 'b' 'a' 'r' 0x00
...
ptr 0xbbc81230 0x80 0xff 0x00 0x00
0xbbc81234 0x80 0xff 0xcd 0xc0
0xbbc81238 0x?? 0x?? 0x?? 0x??
...
0xbbc812a8 0x?? 0x?? 0x?? 0x??
ptr[0]
現在包含大小,以容納4個char
值的緩衝區的地址,我們將字符串「foo」複製到緩衝區。同樣,ptr[1]
包含另一個4字節緩衝區的地址,該緩衝區現在包含字符串「bar」。
此外,必須注意,數組中的第一個元素是ptr [0]。 – SirDarius 2012-03-27 12:21:36
嘗試在'scanf's和'printf'之間做一些事情。你應該看到一些未定義的行爲。 – stanwise 2012-03-27 12:23:05
耶ptr [0]肯定有!感謝您的回覆! – 2012-03-27 12:45:38