“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");