如果以下任何一项是正确的并且被认为是创建能够容纳 100 个字符的 char 字符串的最佳实践,哪一项是正确的?
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
一个字节。 void
指针分配给任何指针,而无需在 C 中进行显式强制转换,并且强制转换是不必要的。由于以下原因,强制转换的返回值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);
这与 的实际定义无关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
根据定义),但它不会受到伤害。
顺便说一句:这个答案主要是关于风格。从语法上讲,所有变体都是可以接受的,只要您包含 stdlib.h(或手动引入 malloc() 的原型)
第一个,因为 char 始终是一个字节,所以 malloc 的强制转换仅在 c++ 中是必需的