做以下事情是否安全?
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(void)
{
char* msg;
strcpy(msg, "Hello World!!!"); //<---------
printf("%s\n", msg);
return 0;
}
或者应该使用以下内容?
char* msg = (char*)malloc(sizeof(char) * 15);
答案 0 :(得分:32)
strdup为你做了malloc和strcpy
char *msg = strdup("hello world");
答案 1 :(得分:12)
您的原始代码未分配消息。试图strcpy到它会很糟糕。你需要在strcpy进入之前分配一些空间。您可以按照建议使用malloc,也可以在堆栈上分配空间,如下所示:
char msg[15];
如果你使用内存,你应该记得在某些时候释放它。如果在堆栈上分配,当内存超出范围时(例如函数退出),内存将自动返回到堆栈。在这两种情况下,您都需要小心分配足够的能够将最长的字符串复制到其中。您可能需要查看strncpy以避免数组溢出。
答案 2 :(得分:2)
第一个版本不安全。并且,msg
应指向“Hello World !!!”的有效内存位置被复制。
char* msg = (char*)malloc(sizeof(char) * 15);
strcpy(msg, "Hello World!!!");
答案 3 :(得分:1)
您需要分配空间。在malloc
之前使用strcpy
。
答案 4 :(得分:1)
char* msg;
strcpy(msg, "Hello World!!!"); //<---------Ewwwww
printf("%s\n", msg);
这是UB。没有第二个想法。 msg
是一个狂野指针,试图取消引用它可能会导致您的实现出现段错误。
msg
指向一个足以容纳"Hello World".
尝试
char* msg = malloc(15);
strcpy(msg, "Hello World!!!");
或
char msg[20];
strcpy(msg, "Hello World!!!");
答案 5 :(得分:1)
使用:
#define MYSTRDUP(str,lit) strcpy(str = malloc(strlen(lit)+1), lit)
现在它很简单,符合标准:
char *s;
MYSTRDUP(s, "foo bar");