在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
现在在人们开始将它标记为dup之前,我已经阅读了以下所有内容,其中没有一个提供我正在寻找的答案:
C FAQ和上述问题的许多答案都引用了一个神秘的错误,即铸造malloc的返回值可以隐藏; 但是,它们都没有在实践中给出这种错误的具体例子.现在要注意我说的错误,而不是警告.
现在给出以下代码:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用gcc 4.2编译上面的代码,有和没有强制转换都会给出相同的警告,并且程序正确执行并在两种情况下都提供相同的结果.
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
Run Code Online (Sandbox Code Playgroud)
那么,任何人都可以提供一个特定的代码示例,说明由于转换malloc返回值而可能发生的编译或运行时错误,或者这仅仅是一个城市传奇?
编辑我在这个问题上遇到了两个写得很好的论点:
我想询问以下案例:
char *temp;
temp = malloc(10);
Run Code Online (Sandbox Code Playgroud)
由于返回类型malloc是void*,在被分配给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*类型?
我一直对此感到好奇 - 为什么在C++中我必须从mallocC而不是在C中转换返回值?
以下是C++中的示例:
int *int_ptr = (int *)malloc(sizeof(int*));
Run Code Online (Sandbox Code Playgroud)
以下是C++中不起作用的示例(无转换):
int *int_ptr = malloc(sizeof(int*));
Run Code Online (Sandbox Code Playgroud)
我听说在C中,事实上,输出输出malloc()是一个错误.
任何人都可以评论这个话题吗?
malloc中使用类型转换有什么用?如果我不在malloc中编写类型转换,那么它将返回什么?(为什么malloc需要进行类型转换?)