6

Cコードをいじってからしばらく経ちました。

gcc を使用して Ubuntu で C コードをコンパイルすると、次のエラーが発生します。

コードをコンパイルするために使用しているコマンドは次のとおりです (これらのエラーが使用しているコンパイラが原因である場合は、それを解消する方法を教えてください):

gcc -o runnable mycode.C 

エラー: 'void*' から 'char**' への変換が無効です</p>

39行目は次のとおりです。

sequence=malloc(sizeof(char *)*seqNum);

シーケンスは次のように宣言されます。

char **sequence;

seqNum は次のように宣言されます。

int seqNum
4

2 に答える 2

7

追加: Arron の実際の問題に対する迅速な解決策は、コメントで sgm によって提供されます。以下のテキストはすべて正確であり、役立つことを願っていますが、当面の問題に対する二流の解決策です.


あなたのコンパイラは、ポインタのキャストについて非常に頑固です (C++ コンパイラを使用していますか?)、次のような明示的なキャストを追加します。

sequence=(char**)malloc(sizeof(char *)*seqNum);

エラーが消えるはずです。別の方法として、次のようなオプションを使用して、コンパイラを簡単に操作できるようにすることもできます。

$(CC) --lighten-up-baby code.c

これは、実際にはハッキングしたくないサードパーティのコードに含まれている場合に適しています。コンパイラのドキュメントを読んで、必要なオプションを見つけてください。私が手元に持っているすべてのgccs (バージョン 4.0 および 4.2) はそのコードに満足しているので、この動作をオフにするためのスイッチに関するアドバイスを提供するのは適切ではありません。

于 2009-07-26T20:25:55.783 に答える
5

malloc の結果を必要な型にキャストする必要があります。

そう:

char **シーケンス;
 ...
 シーケンス = (char **)malloc(sizeof(char *) * seqNum);

また、シーケンスを使用する場合は、これまで行ったように「char *」のリストを割り当てる必要がありますが、ポイント先のメモリが割り当てられていないことを覚えておいてください。ポインター自体のリスト。

これがエラーである理由の 1 つは、異なるポインター型間で代入を行うと、必要なアラインメントが変わる可能性があるためです。Malloc は、任意の型に適した配置でスペースへのポインターを返すことが保証されています。

于 2009-07-26T20:25:54.473 に答える