2013-05-28 38 views
6

私はエラーを生成しますCプログラムを持っている:無効な変換[-fpermissive]

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; 
} 

私は何間違っている?

+2

どのように確認してくださいあなたはCのコードではなくC++のコードとしてこれをコンパイルしていることがありますか? – nos

+1

@Sildorethあなたの主観的な好みに合わせてコーディングスタイルを変更するために、投稿を編集しないでください**。それはただの破壊行為であり、誰にも役立たない。あなたの編集は決して承認されてはいけません。編集ロールバック。 – Lundin

+0

言われているように、このポストのインデントはひどく矛盾しており、修正が必要です。インデントを変更するだけの編集は問題ありません。 – Lundin

答えて

15

Cでは、void*T*に暗黙的に変換可能です。Tは任意のタイプです。セクション6.3.2.3からC99標準のポインタ

A pointer to void may be converted to or from a pointer to any incomplete or object type. A pointer to any incomplete or object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer.

malloc()void*を返し、headstruct 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: In function 'int main()': main.cpp:5:31: error: invalid conversion from 'void*' to 'int*' [-fpermissive]


また、onetwothree()機能が正しくメモリを割り当てていません。

head = malloc(sizeof(struct node)); 

し、その後、最終的には、未定義の動作ですhead->next->nextを参照解除:これは、1つstruct nodeのみを割り当てます。 struct nodeごとに個別のmalloc()が必要です。 free()を覚えておいてくださいmalloc()は何ですか?

+0

私は詳細を覚えていませんが、関数とデータへのポインタはcで変更できませんでしたか?それは間違っていますか?それは "任意のデータ型"でなければなりませんか? –

+0

@andrewcookeそれは正しいです。しかし、共通のサーバ/デスクトッププラットフォームでは、posixは少なくとも暗黙のうちにvoid *と関数ポインタを変更する必要があるようです。 – nos

+0

@andrewcooke、私は、不完全な、またはオブジェクトのタイプ_を示すC99標準の関連セクションの回答を更新します。 – hmjd

2

malloc(を返します)を使用しているため、明示的キャストを行わずにnode*タイプの構造体を初期化するため、この警告/エラーが発生しています。このエラーを取り除くために

あなたは、このようにコードを変更することができます:

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

またはあなたにも、これらのエラーを無視しますあなたのコンパイラに「-fpermissive」フラグを追加することができます。

EDIT:しかし、ええ、私はCコンパイラでは、これは起こるべきではありませんということについて考えていませんでしたとにかく

+4

-1、間違った答え。これはCではなくC++であり、 'void *'はデータ型へのポインタに簡単に変換します。 –

+0

ええ、私は私の答えを編集し、それを考えなかった、申し訳ありません。 –

+0

@ JensGustedt C++ comilperでコンパイルした場合でも、Cコードでもこのエラーが表示されるため、間違った答えはなく、ダウンボントの価値は低くなります。 – A4L

関連する問題