malloc的最佳实践是什么?

5 c malloc char

如果以下任何一项是正确的,并且被认为是创建一个能够容纳100个字符的字符串的最佳做法?

char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
char * charStringC = (char*)malloc(100);
char * charStringD = (char*)malloc(sizeof(char)*100);
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 12

char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
Run Code Online (Sandbox Code Playgroud)

两者都同样正确.
本评估中应考虑的两个要点是:

  1. charC标准保证大小为一个字节.
  2. void指针可以被分配给任何指针而不C中的显式转换和铸造是不必要的.malloc由于以下原因,转换返回值被视为不良做法:

铸造malloc的返回值有什么问题?


以上答案适用于OP中提到的选项.更好的做法是使用sizeof而不对任何类型的大小做出任何假设.这就是sizeof存在的原因和目的.在这种情况下,最佳做法是使用:

char * charStringB = malloc(sizeof(*charStringB)*100);
Run Code Online (Sandbox Code Playgroud)

请注意,这*charStringBchar您相同,但这为您提供了灵活性,如果您希望将来更改类型,那么您需要记住进行修改的地方数量会减少.

  • 但作为一种最佳实践,我会选择`malloc(sizeof(char)*100)`,因为对于任何其他类型,你需要`sizeof`. (3认同)
  • `char*charStringB = malloc(sizeof(*charStringB)*100)的好处;`如果我们决定支持Unicode(16或32位字符),那么[在这一行]需要改变的就是` char`改为`wchar_t`,其他一切都按预期工作. (2认同)

wil*_*ser 5

最一般的形式是:

#include <stdio.h>

typedef struct { int a; char b[55]; } Thing;

Thing *p;
p = malloc (100 * sizeof *p);
Run Code Online (Sandbox Code Playgroud)

这与实际定义无关Thing,因此如果您将"重用"该行作为

Typedef { float water; int fire; } OtherThing;
OtherThing *p;
p = malloc (100 * sizeof *p);
Run Code Online (Sandbox Code Playgroud)

它仍然可以按预期运行.

原案件会产生:

char *p;
p = malloc (100 * sizeof *p);
Run Code Online (Sandbox Code Playgroud)

sizeof *p当然,这将是多余的(从sizeof(char) == 1定义上来说),但它不会受到伤害.

顺便说一句:这个答案主要是关于风格.从语法上讲,所有变体都是可以接受的,假设您包含stdlib.h(或者手动为malloc()引入原型)