什么是最好的实践的malloc?(What is the Best Practice for mal

2019-07-17 17:14发布

其中如果有下面的是正确的,将被视为创造能够容纳100个字符一个字符的字符串最佳做法?

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

Answer 1:

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

两者都同样正确。
应该在这个评价被认为是很重要的两点是:

  1. 的大小char被保证是由C标准的一个字节。
  2. void指针可以被分配给任何指针而不C中的显式转换和铸造是不必要的。 铸造的返回值malloc被认为是因为以下的坏习惯:

这有什么错铸造的malloc的返回值?


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

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

需要注意的是*charStringB是相同的char ,但是这给你的灵活性,如果你想改变未来的类型 ,然后有少的,你需要记住进行修改名额。



Answer 2:

最一般的形式是:

#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的原型())



Answer 3:

第一个,因为焦炭是总是一个字节,的malloc铸造只在C ++ necesary



文章来源: What is the Best Practice for malloc?
标签: c char malloc