17

执行以下操作是否安全?

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

6 回答 6

36

strdup 为您执行 malloc 和 strcpy

char *msg = strdup("hello world");
于 2011-03-18T16:31:03.087 回答
12

您的原始代码未分配味精。尝试 strcpy 会很糟糕。您需要在 strcpy 进入之前分配一些空间。您可以按照建议使用 malloc 或在堆栈上分配空间,如下所示:

char msg[15];

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

于 2011-03-18T16:29:21.190 回答
2

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

char* msg = (char*)malloc(sizeof(char) * 15);
strcpy(msg, "Hello World!!!");
于 2011-03-18T16:27:36.203 回答
2

采用:

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

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

char *s;
MYSTRDUP(s, "foo bar");
于 2011-03-18T17:57:42.130 回答
1

您需要分配空间。mallocstrcpy. _

于 2011-03-18T16:27:57.330 回答
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!!!");
于 2011-03-18T16:37:32.363 回答