如果以下任何一项是正确的,并且被认为是创建一个能够容纳100个字符的字符串的最佳做法?
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
char * charStringC = (char*)malloc(100);
char * charStringD = (char*)malloc(sizeof(char)*100);
Run Code Online (Sandbox Code Playgroud)
Alo*_*ave 12
char * charStringA = malloc(100);
char * charStringB = malloc(sizeof(char)*100);
Run Code Online (Sandbox Code Playgroud)
两者都同样正确.
本评估中应考虑的两个要点是:
charC标准保证大小为一个字节. void指针可以被分配给任何指针而不C中的显式转换和铸造是不必要的.malloc由于以下原因,转换返回值被视为不良做法: 以上答案适用于OP中提到的选项.更好的做法是使用sizeof而不对任何类型的大小做出任何假设.这就是sizeof存在的原因和目的.在这种情况下,最佳做法是使用:
char * charStringB = malloc(sizeof(*charStringB)*100);
Run Code Online (Sandbox Code Playgroud)
请注意,这*charStringB与char您相同,但这为您提供了灵活性,如果您希望将来更改类型,那么您需要记住进行修改的地方数量会减少.
最一般的形式是:
#include <stdio.h>
typedef struct { int a; char b[55]; } Thing;
Thing *p;
p = malloc (100 * sizeof *p);
Run Code Online (Sandbox Code Playgroud)
这与实际定义无关Thing,因此如果您将"重用"该行作为
Typedef { float water; int fire; } OtherThing;
OtherThing *p;
p = malloc (100 * sizeof *p);
Run Code Online (Sandbox Code Playgroud)
它仍然可以按预期运行.
原案件会产生:
char *p;
p = malloc (100 * sizeof *p);
Run Code Online (Sandbox Code Playgroud)
sizeof *p当然,这将是多余的(从sizeof(char) == 1定义上来说),但它不会受到伤害.
顺便说一句:这个答案主要是关于风格.从语法上讲,所有变体都是可以接受的,假设您包含stdlib.h(或者手动为malloc()引入原型)