如果以下任何一项是正确的,并且被认为是创建一个能够容纳100个字符的字符串的最佳做法?
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
char * charStringC = (char*)malloc(100);
char * charStringD = (char*)malloc(sizeof(char)*100);
答案 0 :(得分:12)
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
两者都同样正确。
本评估中应考虑的两个要点是:
char
的大小保证为C标准的一个字节。 void
指针分配给任何指针而不在C中显式转换,并且不需要转换。由于以下原因,转换malloc
的返回值被视为不良做法:<强> What's wrong with casting malloc's return value? 强>
上述答案适用于OP中提到的选项。更好的做法是使用sizeof
而不对任何类型的大小做任何假设。这是sizeof
存在的原因和目的。在这种情况下,最佳做法是使用:
char * charStringB = malloc(sizeof(*charStringB)*100);
请注意,*charStringB
与char
相同,但这为您提供了灵活性,如果您希望将来更改类型,那么您的地点数就会减少需要记住进行修改。
答案 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
),但它不会受到伤害。
答案 2 :(得分:3)
第一个,因为char总是一个字节,malloc的强制转换只是c ++中必需的