malloc的最佳实践是什么?

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

char * charStringA = malloc(100); char * charStringB = malloc(sizeof(char)*100); char * charStringC = (char*)malloc(100); char * charStringD = (char*)malloc(sizeof(char)*100); 

 char * charStringA = malloc(100); char * charStringB = malloc(sizeof(char)*100); 

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

  1. c标准保证char大小为一个字节。
  2. 可以将void指针分配给任何指针而不在C中显式转换,并且不需要转换。 由于以下原因, malloc的返回值被视为不良做法:

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


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

 char * charStringB = malloc(sizeof(*charStringB)*100); 

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

最一般的forms是:

 #include  typedef struct { int a; char b[55]; } Thing; Thing *p; p = malloc (100 * sizeof *p); 

这与Thing的实际定义Thing ,因此如果您将“重用”该行作为

 Typedef { float water; int fire; } OtherThing; OtherThing *p; p = malloc (100 * sizeof *p); 

它仍然可以按预期运行。

原案件会产生:

 char *p; p = malloc (100 * sizeof *p); 

sizeof *p当然是多余的(因为sizeof(char) == 1 ),但它不会受到伤害。

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

第一个,因为char总是一个字节,malloc的强制转换只是c ++中必需的