8

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

我究竟做错了什么?

4

3 回答 3

19

在 C 中,a可以隐式void*转换为任何类型的 a。从C99 标准的第6.3.2.3 节指针:T*T

指向 void 的指针可以转换为指向任何不完整或对象类型的指针或从指针转换。指向任何不完整或对象类型的指针可以转换为指向 void 的指针并再次返回;结果应与原始指针比较。

malloc()返回 avoid*并且可以分配而不强制转换为head, a 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。

于 2013-05-28T13:42:24.150 回答
10

您遇到此警告/错误是因为您正在使用malloc(返回 a void*)来初始化类型结构node*而不进行显式转换。

要消除此错误,您可以通过以下方式更改代码:

head = (struct node *)malloc(sizeof(struct node));

或者您也可以在编译器中添加“-fpermissive”标志,然后忽略这些错误。

编辑:但是,是的,我没想到无论如何这都不应该在 C 编译器中发生

于 2013-05-28T13:44:17.327 回答
1

利用:

head = (struct node*) malloc(sizeof(struct node));

C++ 不支持对void*返回的 进行隐式转换malloc(),而 C 支持。您需要对返回值进行类型转换。

于 2020-11-15T07:47:14.013 回答