“strcpy”和“malloc”?

时间:2011-03-18 16:25:41

标签: c malloc strcpy

做以下事情是否安全?

#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);

6 个答案:

答案 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");