6

如果以下任何一项是正确的并且被认为是创建能够容纳 100 个字符的 char 字符串的最佳实践,哪一项是正确的?

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

3 回答 3

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

两者同样正确。
在此评估中应考虑的两个重点是:

  1. C 标准保证大小为char一个字节。
  2. 可以将void指针分配给任何指针,而无需在 C 中进行显式强制转换,并且强制转换是不必要的。由于以下原因,强制转换的返回值malloc被认为是一种不好的做法:

强制转换 malloc 的返回值有什么问题?


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

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

请注意,这*charStringB与 相同,char但这为您提供了灵活性,如果您想在将来更改类型,那么您需要记住进行修改的地方数量就会减少。

于 2012-12-31T09:46:21.167 回答
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根据定义),但它不会受到伤害。

顺便说一句:这个答案主要是关于风格。从语法上讲,所有变体都是可以接受的,只要您包含 stdlib.h(或手动引入 malloc() 的原型)

于 2012-12-31T09:52:25.083 回答
3

第一个,因为 char 始终是一个字节,所以 malloc 的强制转换仅在 c++ 中是必需的

于 2012-12-31T09:45:39.810 回答