Q强制类型转换malloc的返回值有什么问题?
A假设你调用了malloc但忘记了#include <stdlib.h>。编译器可能会假设malloc是一个返回int的函数,这当然是错误的,并将导致问题。现在,如果你的调用malloc的形式是
char *p = malloc(10);编译器会注意到你似乎在将一个整数赋值给一个指针,并可能发出一个类似“指针从整数赋值缺少强制类型转换”的警告(参见问题7.6),这会提醒你存在问题。(问题当然是你忘记了#include <stdlib.h>,而不是忘记使用强制类型转换。)另一方面,如果你的调用malloc包含强制类型转换
char *p = (char *)malloc(10);编译器很可能会假设你知道你在做什么,你确实想将int返回的malloc转换为指针,因此编译器很可能不会发出警告。但当然malloc并不返回int,所以尝试将它不返回的int转换为指针可能会导致另一种更难追踪的问题。
(当然,编译器越来越可能——尤其是在 C99 下——在调用没有原型在作用域的函数时发出警告,并且这种警告会提醒你缺少<stdlib.h>,无论是否使用了强制类型转换。)