“strcpy”和“malloc”?

做以下事情是否安全?

#include  #include  #include  int main(void) { char* msg; strcpy(msg, "Hello World!!!"); //<--------- printf("%s\n", msg); return 0; } 

或者应该使用以下内容?

 char* msg = (char*)malloc(sizeof(char) * 15); 

您的原始代码不会分配消息。 试图str to它会很糟糕。 你需要在strcpy之前分配一些空间。 您可以按照建议使用malloc,也可以在堆栈上分配空间,如下所示:

 char msg[15]; 

如果你对内存进行malloc,你应该记得在某些时候释放它。 如果在堆栈上分配,则当内存超出范围时(例如,函数退出),内存将自动返回到堆栈。 在这两种情况下,您都需要小心分配足够的能够将最长的字符串复制到其中。 您可能需要查看strncpy以避免数组溢出。

strdup为你做malloc和strcpy

 char *msg = strdup("hello world"); 

第一个版本不安全。 并且, msg应指向“Hello World !!!”的有效内存位置 被复制。

 char* msg = (char*)malloc(sizeof(char) * 15); strcpy(msg, "Hello World!!!"); 

你需要分配空间。 在strcpy之前使用malloc

  char* msg; strcpy(msg, "Hello World!!!"); //<---------Ewwwww printf("%s\n", msg); 

这是UB。 没有第二个想法。 msg是一个狂野指针,尝试取消引用它可能会导致您的实现出现段错误。

msg指向一个足以容纳"Hello World".的有效内存位置"Hello World".

尝试

 char* msg = malloc(15); strcpy(msg, "Hello World!!!"); 

要么

 char msg[20]; strcpy(msg, "Hello World!!!"); 

使用:

 #define MYSTRDUP(str,lit) strcpy(str = malloc(strlen(lit)+1), lit) 

现在它很容易和标准符合:

 char *s; MYSTRDUP(s, "foo bar");