其中如果有下面的是正确的,将被视为创造能够容纳100个字符一个字符的字符串最佳做法?
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
char * charStringC = (char*)malloc(100);
char * charStringD = (char*)malloc(sizeof(char)*100);
其中如果有下面的是正确的,将被视为创造能够容纳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);
两者都同样正确。
应该在这个评价被认为是很重要的两点是:
char
被保证是由C标准的一个字节。 void
指针可以被分配给任何指针而不C中的显式转换和铸造是不必要的。 铸造的返回值malloc
被认为是因为以下的坏习惯: 这有什么错铸造的malloc的返回值?
上述答案适用于OP提到的选项。 一个更好的做法是使用sizeof
未做任何类型的大小做任何假设。 这是原因和目的sizeof
存在。 在这种情况下,最好的做法将是使用方法:
char * charStringB = malloc(sizeof(*charStringB)*100);
需要注意的是*charStringB
是相同的char
,但是这给你的灵活性,如果你想改变未来的类型 ,然后有少的,你需要记住进行修改名额。
最一般的形式是:
#include <stdio.h>
typedef struct { int a; char b[55]; } Thing;
Thing *p;
p = malloc (100 * sizeof *p);
这个工程的实际定义的indepentely 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:这个答案主要是关于风格。 在语法上,所有的变体acceptible,给你包括stdlib.h中(或手动引入了malloc的原型())
第一个,因为焦炭是总是一个字节,的malloc铸造只在C ++ necesary