我正在编写用于合并两个 C 字符串的简单函数。在尝试动态分配新的内存块时,我发现:
char * out = new char[size];
std::cout << strlen(out) <<std::endl;
当 size 为 4 时返回 16,当 size 为 22 时返回 40,依此类推。有谁知道它为什么会这样以及如何为具有一定数量字符的 c 字符串分配内存?
我正在编写用于合并两个 C 字符串的简单函数。在尝试动态分配新的内存块时,我发现:
char * out = new char[size];
std::cout << strlen(out) <<std::endl;
当 size 为 4 时返回 16,当 size 为 22 时返回 40,依此类推。有谁知道它为什么会这样以及如何为具有一定数量字符的 c 字符串分配内存?
分配的内存未初始化。 strlen()
只是不断地通过内存充电,直到遇到空字符('\0'
)。由于您尚未初始化 指向的out
内存,因此该内存的内容未定义,因此 的行为也是如此strlen()
。
strlen()
不测量分配的大小,因此您new
分配过多内存的解释是不正确的,因为您用来测量分配大小的工具根本没有这样做。
在您的情况下,strlen()
正在阅读超出此分配的边界。在这种情况下,结果可能是“错误”值(如您在此处看到的),或者您的程序可能会简单地崩溃。
使用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;