malloc(5)= 5个字符还是5个字节?

时间:2017-07-13 13:07:30

标签: c

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

via malloc()为字符串保留了5个字节的空间。

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

    return data;
}
  

以下代码按预期打印aaabb

char *test;
test = Function();

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

不改变malloc(5) ..

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

打印aaabbbccc

但是malloc(5)应该只有5个字符的预留空间。不是9。

问题1

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

问题2 :如何只为5个字符预留空间?

4 个答案:

答案 0 :(得分:8)

您为5个字节分配了空间(根据定义,.section-first { margin-left: 0; margin-right: 0; } 为1个字节),但写入了超过5个字节。 C不会阻止您在分配的内存或数组的范围之外写入。如果您这样做,则会调用undefined behavior

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

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

答案 1 :(得分:6)

在C规范的语言中,字节和char相同的东西。因此,主题中问题的答案是:两者。

至于第二个问题,如果您尝试在分配的空间中存储超过5个字节(大小仅为5个字节),则程序的行为是未定义的。不要那样做。字符串"aaabb"的大小为6个字节,因为C字符串以空值终止(第六个字节是空字符,值为0)。

答案 2 :(得分: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中,您可能会将更多字节写入已分配的缓冲区中。在这种情况下,您将覆盖一些内存,这可能会导致程序失败或甚至更有趣的结果。

在优秀文章" Smashing The Stack For Fun and Profit"中得到了很好的解释。作者:AlephOne。 http://insecure.org/stf/smashstack.html

答案 3 :(得分:-1)

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