我应该显式地转换malloc()的返回值吗?

maw*_*wia 52 c pointers casting

我想询问以下案例:

char *temp;
temp = malloc(10);
Run Code Online (Sandbox Code Playgroud)

由于返回类型mallocvoid*,在被分配给temp之前,是否会malloc被隐式转换为char*类型返回的指针?标准在这方面说了什么?

如果我们的指针变量是某种结构类型,例如:

struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)

如果我们将内存分配给temp而不struct node*将其强制转换为类型,是否会将其隐式转换为struct node*类型,还是必须将其显式转换为struct node*类型?

unw*_*ind 51

如果你喜欢"不要重复自己"的心态,那么你应该很有吸引力,你不需要在malloc()调用中重复变量声明中的类型名称.因为,正如大家所指出的那样,你不会:指针转换为和void *不转换指针,但函数指针除外.

另外,在那个注释中,你不需要重复使用sizeof任何一个.第二个例子,在分配结构时,可以这样写:

struct node *temp;
temp = malloc(sizeof *temp);
Run Code Online (Sandbox Code Playgroud)

在我不那么谦虚的意见中,这是最好的方式.

避免重复自己会减少你写的东西的数量,从而减少任何这些错误的风险.

注意sizeof参数中的星号,这意味着"此指针指向的对象的大小",这当然与"类型的大小"相同,struct node但不重复类型名称.这是因为sizeof计算(在编译时!)作为其参数的表达式的大小.对于这种情况.就像sizeof 3计算类型表达式的大小一样int,sizeof *temp计算实例的大小struct node.

当然,你确实重复了一些事情,即变量名称本身,但这通常是一个更简单的表达式,更容易正确,并且编译器也可以更容易发现错误.

  • 这是一个应用DRY是一种不安全的编程实践的例子(参见下面的链接).避免重复减少错误的论点是语境.当谈到C中的指针,因为模棱两可而臭名昭着,它将导致糟糕的juju.我宁愿冗长并重复演员在编译时发现问题(而不是运行时):https://www.securecoding.cert.org/confluence/display/seccode/MEM02-C.+Immediately+cast+的+导致+ + A +存储器+分配+功能+呼叫的+成+ A +指针+到+的+分配+型 (3认同)
  • 像往常一样,securecoding.cert.org充斥着垃圾.或者,更礼貌地说,我在该网站上阅读的每一篇文章都充满了错误的信息(想想`ftell` vs`fstat`),广泛认为是坏的和有害的风格,和/或只是简单的货物崇拜"安全"编程. (3认同)
  • @luis.espinal 嗯?强制转换可以*隐藏*错误,因为它们明确告诉编译器“执行此操作!” 并且通常会阻止它生成警告,即使您要求的内容似乎是错误的。任何时候您看到强制转换 C 代码时,您都需要*更努力地思考*是否需要执行什么操作,以及为什么首先认为强制转换是必要的。如果你没有必要,永远不要投射。 (2认同)

tek*_*ues 33

C中的void指针可以在没有显式强制转换的情况下分配给任何指针.

  • C不确定是否可以将函数指针强制转换为非函数指针或返回.C++明确禁止它,而C++ 1x有条件地支持它 (11认同)
  • POSIX(至少2008)要求函数指针与数据指针的大小相同,其中C标准保留未定义的. (10认同)
  • 我不认为它适用于函数指针. (9认同)

sth*_*sth 10

C隐式转换为from和to void*,因此转换将自动完成.在C++中只转换 void*将被隐式完成,需要显式转换另一方向.

  • 注意C++确实支持在没有强制转换的情况下转换为void*. (2认同)