通过函数返回的字符串长度为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个字符预留空间?
答案 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()用于大型分配,或者在函数返回后需要保留的存储