如何在调用strcpy之前分配数组?

LLL*_*LLL 7 c string

鉴于:

char test[] = "bla-bla-bla";
Run Code Online (Sandbox Code Playgroud)

哪两个更正确?

char *test1 = malloc(strlen(test));
strcpy(test1, test);
Run Code Online (Sandbox Code Playgroud)

要么

char *test1 = malloc(sizeof(test));
strcpy(test1, test);
Run Code Online (Sandbox Code Playgroud)

Tom*_*zyk 24

这将适用于所有以null结尾的字符串,包括指向char数组的指针:

char test[] = "bla-bla-bla";
char *test1 = malloc(strlen(test) + 1);
strcpy(test1, test);
Run Code Online (Sandbox Code Playgroud)

您将无法获得指向char*const char*使用的数组的正确大小sizeof.因此,该解决方案更通用.

  • 那么将sizeof(char)放入代码有什么问题?它使你在尝试做的事情上更明确.因此,如果代码被更改为使用wchar_t,那么更容易找到代码需要更改的位置.所以:虽然这里不需要,但我认为将它包含在代码中是有益的,因为它使代码的含义更加精确. (9认同)
  • strlen(test)+ 1. strlen不计算必要的NULL. (6认同)
  • @Tomasz:除了`sizeof(char)`被定义为等于'1`字节.至于其中*位*的数量,但...... (4认同)
  • 我强烈反对多年来写'sizeof(char)`.它增加了视觉混乱,C语言中对象大小的语义从一开始就是`sizeof(char)`的单位.这使得表达式在一般情况下变得清晰简单,并且在其他情况下要求注意对类型化分配的依赖. (3认同)

mmo*_*nem 2

char test[]="bla-bla-bla";
char *test1 = malloc(strlen(test) + 1); // +1 for the extra NULL character
strcpy(test1, test);
Run Code Online (Sandbox Code Playgroud)