我正在編寫合併兩個C字符串的簡單函數。當試圖動態分配新的內存塊時,我發現:新分配內存太多
char * out = new char[size];
std::cout << strlen(out) <<std::endl;
當大小爲4時返回16,當大小爲22時返回40等等。 有沒有人有一個想法,爲什麼它的行爲,以及如何分配C字符串的內存與一定數量的字符?
我正在編寫合併兩個C字符串的簡單函數。當試圖動態分配新的內存塊時,我發現:新分配內存太多
char * out = new char[size];
std::cout << strlen(out) <<std::endl;
當大小爲4時返回16,當大小爲22時返回40等等。 有沒有人有一個想法,爲什麼它的行爲,以及如何分配C字符串的內存與一定數量的字符?
使用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;
從技術上講,'new char [size]()'仍然使用'new'。 – chris
這只是代碼片段。之後,我有一個for循環,把精確的數字(等於變量'大小')的字符放入'out'char *。例如 - 而不是'aabb'字符串我有'aabbrrrrzzzzzzzz' – pawels1991
@ pawels1991,他們中的任何一個是空終止符? – chris
分配的內存未初始化。 strlen()
只是繼續通過內存充電,直到遇到空字符('\0'
)。由於您尚未初始化out
指向的內存,因此此內存的內容未定義,因此strlen()
的行爲也是如此。
strlen()
不衡量分配的大小,所以你的解釋,即new
被分配太多的內存不正確,只是因爲你正在使用的工具來測量分配的大小沒有做到這一點的。
就你的情況而言,strlen()
正在超出此分配範圍。在這種情況下,結果可能是一個「錯誤」的值(正如你在這裏看到的),或者你的程序可能會崩潰。
'new'初始化它創建的一些對象,而不是其他對象,所以解釋爲什麼這個分配不初始化分配的內存可能是有用的。 –
您不初始化字符串。 'strlen()'需要一個0結尾的緩衝區。問了這麼多次... – 2013-08-06 20:18:53
是的 - 只要我看到strlen()在一個問題.... –
這是不明確這是建議的原始副本。這個問題涉及將'strlen'應用於已初始化但未包含終止空字符的數組。這個問題將'strlen'應用於未初始化的數組。從這個問題我們不清楚這個混淆是關於'strlen'如何操作,或者關於'new'是否以及如何初始化以這種方式分配的數組。 –