Is typecast required in malloc?
在malloc中,typecast的用法是什么?如果我不在malloc中写打字,它会返回什么?(为什么在malloc中需要打字?)
我想你的意思是:
int *iptr = (int*)malloc(/* something */);
在C语言中,您不必(也不应该)从malloc转换返回指针。它是一个void *,在c中,它被隐式转换为另一个指针类型。
int *iptr = malloc(/* something */);
是首选格式。
这不适用于C++,它不共享相同的EDCOX1×2的隐式抛出行为。
- 你能解释清楚吗?
- @用户615929-你需要什么更清楚的解释?您不需要从malloc强制转换返回void *,因为它可以自由、隐式地转换为其他指针类型。
- char iptr=(char)malloc(/*something);表示它将键入cast-in-char;char iptr=malloc(/something);分配大小后…它将如何将类型转换为char?
- 你是说它会自动打字吗?
- @用户615929-在C语言中,指向void的指针(void *可以转换为任何其他指针类型,而无需转换,这与指向其他类型的指针不同(例如,将char *类型的值赋给int *类型的变量需要显式转换)。因此,malloc返回的值将自动转换为目标指针类型,无需强制转换。注意,在C的旧版本(1989年以前)中,malloc返回char *,因此,如果将结果分配给不同类型的变量,则显式强制转换是必要的。
您不应将malloc()的返回值用c表示。这样做是:
- 不需要,因为void *与任何其他指针类型兼容(函数指针除外,但此处不适用)。
- 潜在危险,因为它可以隐藏错误(缺少函数声明)。
- 凌乱,强制转换很长,而且常常很难读取,所以它只会使代码更丑。
所以:没有好处,至少有三个缺点,所以应该避免。
- 我没拿到第二分。你能进一步解释一下吗?
- 第二点是错误的。如果忘记包含则不管是否强制转换malloc的结果,都会得到一个警告"隐式函数声明"(不需要任何额外的编译器开关)。如果您生成并忽略警告——这是您的问题,而不是拉格朗日,而不是编译器,而不是强制转换——那就是您。第一点是一个枯燥的事实,没有争论。所有其他的要点都是关于你个人的偏好。
您不需要强制转换malloc的返回值。这将在C FAQ:http://c-faq.com/malloc/cast.html和http://c-faq.com/malloc/mallonocast.html中进一步讨论。
仅仅因为malloc返回一个void,并且由于void*没有定义大小,所以不能对它应用指针算术。因此,通常将指针强制转换为分配的内存块实际指向的数据类型。
答案是正确的,我只是有个建议:
- 不要玩指针(malloc()返回的指针)太多,尽快将它们强制转换为指定的类型;
- 如果需要对它们进行一些数学运算,请将它们强制转换为char*,这样ptr++就意味着除了:向其中添加1(将添加数据类型的大小,其中char的大小为1)。