我有一个产生错误的C程序:
invalid conversion from 'void*' to 'node*' [-fpermissive]
这是我的代码:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct node
{
int data;
struct node* next;
};
struct node* onetwothree();
int main()
{
struct node* ptr;
ptr = onetwothree();
return 0;
}
struct node* onetwothree()
{
struct node* head;
struct node* temp;
head = malloc(sizeof(struct node));
temp = head;
for(int i=1; i<=3; i++)
{
temp->data = i;
if(i<3)
temp=temp->next;
else
temp->next = NULL;
}
return head;
}
我做错了什么?
答案 0 :(得分:16)
在C中,void*
可以转换为T*
,其中T
是任何类型。来自C99标准的 6.3.2.3指针部分:
指向void的指针可以转换为指向任何不完整或对象的指针 类型。指向任何不完整或对象类型的指针可以转换为指向void的指针 又回来了;结果应该等于原始指针。
malloc()
会返回void*
并且可以在不转发head
的情况下分配给struct node*
。在C ++中不是这样,所以我怀疑正在使用C ++编译器来编译这个C代码。
例如:
#include <stdlib.h>
int main()
{
int* i = malloc(sizeof(*i));
return 0;
}
编译时使用:
gcc -Wall -Werror -pedantic -std = c99 -pthread main.c -o main
没有错误。编译时使用:
g ++ -Wall -Werror -pedantic -std = c ++ 11 -pthread main.cpp -o main
发射:
main.cpp:在函数'int main()'中: main.cpp:5:31:错误:从'void *'无效转换为'int *'[-fpermissive]
此外,onetwothree()
函数未正确分配内存。它仅分配一个struct node
:
head = malloc(sizeof(struct node));
然后,最终解除引用head->next->next
这是未定义的行为。每个malloc()
都需要一个struct node
个人。
请记住free()
malloc()
d。
答案 1 :(得分:6)
您遇到此警告/错误,因为您正在使用malloc
(返回void*
)来初始化node*
类型的结构而不进行显式转换。
要摆脱此错误,您可以通过以下方式更改代码:
head = (struct node *)malloc(sizeof(struct node));
或者您也可以在编译器中添加“-fpermissive”标志,然后忽略这些错误。
编辑:但是,我没有想到这不应该在C编译器中发生的事实
答案 2 :(得分:0)
使用:
head = (struct node*) malloc(sizeof(struct node));
C ++不支持C所做的由void*
返回的malloc()
的隐式转换。您需要强制转换返回值。