2013-08-06 62 views
1

我正在編寫合併兩個C字符串的簡單函數。當試圖動態分配新的內存塊時,我發現:新分配內存太多

char * out = new char[size]; 
std::cout << strlen(out) <<std::endl; 

當大小爲4時返回16,當大小爲22時返回40等等。 有沒有人有一個想法,爲什麼它的行爲,以及如何分配C字符串的內存與一定數量的字符?

+1

您不初始化字符串。 'strlen()'需要一個0結尾的緩衝區。問了這麼多次... – 2013-08-06 20:18:53

+2

是的 - 只要我看到strlen()在一個問題.... –

+0

這是不明確這是建議的原始副本。這個問題涉及將'strlen'應用於已初始化但未包含終止空字符的數組。這個問題將'strlen'應用於未初始化的數組。從這個問題我們不清楚這個混淆是關於'strlen'如何操作,或者關於'new'是否以及如何初始化以這種方式分配的數組。 –

回答

0

使用new分配內存未初始化內存:

char * out = new char[size]; 

// Add this code to initialize out 
memset(out,'A',size-1); 
out[size-1]='\0'; 

std::cout << strlen(out) <<std::endl; 
+1

從技術上講,'new char [size]()'仍然使用'new'。 – chris

+0

這只是代碼片段。之後,我有一個for循環,把精確的數字(等於變量'大小')的字符放入'out'char *。例如 - 而不是'aabb'字符串我有'aabbrrrrzzzzzzzz' – pawels1991

+1

@ pawels1991,他們中的任何一個是空終止符? – chris

5

分配的內存未初始化。 strlen()只是繼續通過內存充電,直到遇到空字符('\0')。由於您尚未初始化out指向的內存,因此此內存的內容未定義,因此strlen()的行爲也是如此。

strlen()衡量分配的大小,所以你的解釋,即new被分配太多的內存不正確,只是因爲你正在使用的工具來測量分配的大小沒有做到這一點的。

就你的情況而言,strlen()正在超出此分配範圍。在這種情況下,結果可能是一個「錯誤」的值(正如你在這裏看到的),或者你的程序可能會崩潰。

+0

'new'初始化它創建的一些對象,而不是其他對象,所以解釋爲什麼這個分配不初始化分配的內存可能是有用的。 –