来自' void *'的无效转换到节点*' [-fpermissive]

时间:2013-05-28 13:39:52

标签: c

我有一个产生错误的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;
}

我做错了什么?

3 个答案:

答案 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()的隐式转换。您需要强制转换返回值。