将内存分配给char*C语言

boo*_*oom 7 c malloc memory-management

这是为char*分配内存的正确方法吗?

char* sides ="5";

char* tempSides;

tempSides = (char*)malloc(strlen(inSides) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)

Cla*_*diu 16

几乎.字符串以NULL结尾,因此您可能希望分配一个额外的字节来存储NULL字节.也就是说,即使sides长度为1个字符,它实际上也是2个字节:{ 5,'\0'}.

所以它会是:

tempSides = (char *)malloc((strlen(sides)+1)*sizeof(char));
Run Code Online (Sandbox Code Playgroud)

如果你想复制它:

strcpy(tempSides, sides);
Run Code Online (Sandbox Code Playgroud)

  • 当你说NULL时你的意思是'\ 0'.'\ 0'是nul,而不是NULL. (8认同)
  • @sharptooth:如果你担心稍后切换到`wchar_t`,那么乘以`sizeof*tempSides`会是最好的. (4认同)
  • @George Phillips:严格来说,你的意思是'空角色'.`nul`是空字符的ASCII名字对象; 术语'nul'不会出现在C标准的任何地方. (3认同)
  • @MSalters:他的意思是检查`malloc`返回值. (3认同)
  • @caf:是的,但是省略它会使代码更难以在必要时调整代码到wchar_t或TCHAR - 如果没有乘法,则存在忘记使用代码的风险. (2认同)
  • 我使用`strncpy`而不是`strcpy`.在这种情况下,我们知道缓冲区足够大,所以`strcpy`就可以了.但是,我更喜欢在所有情况下都避免使用`strcpy`.开销很小,你不太可能看到性能上的真正差异. (2认同)

jwe*_*ich 9

注意:

  1. 字符串是零终止的(\ 0),而strlen()不计算它;
  2. 根据定义,sizeof(char)是1(字节),因此不需要;
  3. 如果使用C(而不是C++)编译器,则无需将其强制转换为char *;

那就是:

char *tempSides = malloc(strlen(inSides) + 1);
Run Code Online (Sandbox Code Playgroud)

不过,如果你想复制内容inSides,你可以使用strdup,例如:

char *tempSides = strdup(inSides);
if (tempSides != NULL) {
    // do whatever you want...
    free(tempSides);
}
Run Code Online (Sandbox Code Playgroud)