malloc的最佳实践是什么?

时间:2012-12-31 09:43:21

标签: c char malloc

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

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

3 个答案:

答案 0 :(得分:12)

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

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

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


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

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

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

答案 1 :(得分:5)

最常见的形式是:

#include <stdio.h>

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

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

这与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()手动引入原型)

答案 2 :(得分:3)

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