malloc(5) = 5 个字符或 5 个字节?

malloc(5) = 5 chars or 5 bytes?

函数返回的字符串长度为 5 个字符

via malloc() 5 字节 space 已为字符串保留。

char *Function () {
    char *data;
    data = malloc(5);
    strcpy(data, "aaabb");

    return data;
}

code below prints aaabb as expected.

char *test;
test = Function();

printf("%s", test);
free(test);

不改变malloc(5)..

将字符串更改为 aaabbbccc:9 个字符长。

打印 aaabbbccc

malloc(5)应该只保留5个字符的空间。不是 9.

问题一

的真正含义是什么
data = malloc(5);

问题2:如何简单地为恰好5个字符预留空间?

在 C 规范的语言中,字节和 char 同一事物 。所以主题行问题的答案是:both.

关于你的第二个问题,如果你试图在分配的 space 中存储超过 5 个字节(大小仅为 5 个字节),你的程序的行为是不确定的。不要那样做。字符串 "aaabb" 的大小为 6 个字节,因为 C 字符串以空字符结尾(第六个字节是空字符,值为 0)。

来自 man(3) malloc:

   malloc() allocates size bytes and returns a pointer to the allocated memory.  The memory is not cleared.  If size is 0, then malloc() returns
   either NULL, or a unique pointer value that can later be successfully passed to free().

请记住,在 C 中,您可能会将更多字节写入分配给它的缓冲区。在这种情况下你会覆盖一些内存,这可能会导致程序失败或更有趣的结果。

在 AlephOne 的优秀文章 "Smashing The Stack For Fun And Profit" 中对此进行了很好的解释。 http://insecure.org/stf/smashstack.html

您为 5 个字节分配了 space(根据定义,char 是 1 个字节),但写入了超过 5 个字节。 C 不会阻止您在分配的内存或数组的范围之外进行写入。如果你这样做,你调用了 undefined behavior.

对于未定义的行为,任何事情都可能发生。您的代码可能会崩溃,可能会输出奇怪的结果,或者(如您的情况)它可能看起来工作正常。稍后,一个看似无关的更改,例如添加一个未使用的局部变量或用于调试的 printf 可能会改变未定义行为的表现方式。

关于您的具体示例,字符串 "aaabb" 实际上由 6 个字节组成:5 个用于相关字符,另外一个用于表示字符串结尾的空字节。因此,对于此字符串,您需要 malloc(6) 才能获得足够的 space。与 "aaabbbccc" 类似,您需要分配 10 个字节而不是 9 个字节。

通常,如果您只需要几个字符(在现代系统中少于 1000 个),您只需在堆栈上声明它们即可。 malloc() 用于大分配,或函数返回后需要保留的存储