1

我正在编写用于合并两个 C 字符串的简单函数。在尝试动态分配新的内存块时,我发现:

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

当 size 为 4 时返回 16,当 size 为 22 时返回 40,依此类推。有谁知道它为什么会这样以及如何为具有一定数量字符的 c 字符串分配内存?

4

2 回答 2

5

分配的内存未初始化。 strlen()只是不断地通过内存充电,直到遇到空字符('\0')。由于您尚未初始化 指向的out内存,因此该内存的内容未定义,因此 的行为也是如此strlen()

strlen() 测量分配的大小,因此您new分配过多内存的解释是不正确的,因为您用来测量分配大小的工具根本没有这样做。

在您的情况下,strlen()正在阅读超出此分配的边界。在这种情况下,结果可能是“错误”值(如您在此处看到的),或者您的程序可能会简单地崩溃。

于 2013-08-06T20:18:43.723 回答
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;
于 2013-08-06T20:18:36.173 回答