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() 用于大分配,或函数返回后需要保留的存储
函数返回的字符串长度为 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() 用于大分配,或函数返回后需要保留的存储