"strcpy"和"malloc"?

LEH*_*LEH 14 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;
}
Run Code Online (Sandbox Code Playgroud)

或者应该使用以下内容?

char* msg = (char*)malloc(sizeof(char) * 15);
Run Code Online (Sandbox Code Playgroud)

pm1*_*100 32

strdup为你做malloc和strcpy

char *msg = strdup("hello world");
Run Code Online (Sandbox Code Playgroud)

  • POSIX是一个标准.我们使用的很多东西都不是C89或C99.这不是不使用这么简单的东西的理由.在编写像MYSTRDUP()之类的密集宏之前,请使用strdup.strdup需要1行来实现作为一个函数,坦率地说,应该在标准中. (10认同)
  • 我会对“像strdup刚遇到怪异的问题”这样的陈述感到非常怀疑。 (4认同)
  • strdup 不是 C 标准,不是 C89 也不是 C99 (3认同)
  • 当然可以,但值得一提的是,这是在 POSIX 中。 (3认同)

qbe*_*220 12

您的原始代码不会分配消息.试图strcpy到它会很糟糕.你需要在strcpy进入之前分配一些空间.您可以按照建议使用malloc,也可以像这样在堆栈上分配空间:

char msg[15];
Run Code Online (Sandbox Code Playgroud)

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