当我们调用(char*)malloc(sizeof(char))来分配字符串的内存时,它会被初始化吗?如何进行初始化?

3
char* str = (char*)malloc(100*sizeof(char)); 
strcpy(str, ""); //Does this line initialize str to an empty string?

在调用第一行后,分配的内存是否包含垃圾?调用第二行后呢?


1
可能是为什么在gcc中malloc将值初始化为0?的重复问题。 - m.s.
man malloc 会告诉你。 - cmaster - reinstate monica
如果您的系统支持,考虑使用strdupasprintf - Basile Starynkevitch
表达式 sizeof(char) 被标准定义为 1,乘以 1 对传递给 malloc() 的参数绝对没有影响。它只会使代码混乱不堪。 - user3629249
2
如果你想让malloc分配的内存被初始化为所有的'\0',那么请使用calloc()而不是malloc()。在所有情况下,请检查(!=NULL)返回值以确保操作成功。在C中,不要强制转换返回值,因为它是一个void*类型,所以可以赋给任何指针。强制转换返回值只会使代码混乱,并在维护时产生麻烦。 - user3629249
3个回答

5
调用第一行之后,分配的内存是否包含垃圾值?
答:它可以包含任何内容,因为按照标准,malloc不需要初始化内存,在大多数实现中也不应该这样做。它很可能只包含先前该内存“用户”放置在那里的任何数据。
调用第二行之后呢?
答:使用该指令,您将字符值为0的\0字符复制到分配的内存的第一个字节。其他所有内容仍然不变。您也可以执行str[0] = '\0'或*str = '\0'。所有这些选项都使str指向“空字符串”。
请注意,由于您将问题标记为C而不是C++,因此强制转换malloc的返回值是多余的。

2

malloc只提供内存空间,并创建指向该内存的指针,然后返回该指针。它不会进行初始化。如果之前有其他东西占用了相同的内存空间,您可能会得到一个垃圾值。


1

是的,malloc返回未初始化的内存,而且是的,你的第二行代码将内存初始化为空字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接