-7

gcc バージョン 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC) でコンパイルしようとしました 入力ファイルに const char があります:

#include <stdio.h>
#include <stdlib.h>
#include "textfile.h"
...
const char * vs=NULL;
vs = textRead("myfile.file");
const char * vv = vs;
free(vs);

この chars vars は、メインの cpp プログラムで使用され、テキストで埋められます。

myfile.file からデータをロードするために、ヘッダーで 1 つの関数 textRead を使用します。

このエラーが発生しました(キャスト変換だと思います)が、どこで間違いを犯したのかわかりません。

warning: deprecated conversion from string constant to ‘char*’
error: invalid conversion from ‘const void*’ to ‘void*’

最初の警告は vs = textRead("myfile.file"); に関するものです。2 番目のエラーは free(vs); に関するものです。

私のコードの何が問題になっていますか?

4

2 に答える 2

1

最初のエラーは、 textRead() 関数が次のように宣言されている可能性が高いためです。

const char *textRead(char *) 

文字列 "myfile.file" ( type を持つconst char *) をchar *自動的に変換することは非推奨です。代わりにa を受け入れるように textRead を変更して修正してくださいconst char *

2 番目のエラー... 繰り返しますが、コンパイラが何を伝えているかを確認してvoid *ください。に暗黙的に変換できる があります。しかし、を にすることはできません。const void *freevoid *const char *const void *const void *void *

適切に使用して適切に戻すことで修正しconstます。

于 2012-12-06T21:48:11.813 に答える
0

関数がどのtextReadように見えるかを投稿していないので、その署名は次のようになっていると思います。

void *textRead( char *filename );

textRead読み取るファイルの名前を取得しているため、渡された文字列を変更する必要はありません (すべきではありません) textRead

void *textRead( char const *filename );

関数を変更できない場合は、コードを次のように変更します。

char filename[] = "myfile.file";
vs = textRead( filename );

についてのエラーメッセージfreeはかなり自明であり、 freea を期待しており、代わりにポインターvoid *を渡しています。の代わりに である必要があるconst理由がわかりません。それを変更すると、エラーはなくなります。vsconst char *char *

vsまた、なぜ直前にのコピーを作成しているのかわかりませんfreeが、その 2 行の間に起こることを投稿していない可能性があります。

于 2012-12-06T21:51:58.583 に答える