0

コードはありますが、コンパイル時に警告が表示されます。これは警告でした:

1_redis.c: In function \342\200\230main\342\200\231:
1_redis.c:131:23: warning: assignment makes integer from pointer without a cast
 [enabled by default]

と書かれていますassignment makes integer from pointer without a castcFilelQueryDataすべてchar*タイプです。なぜですか?

#define MAX_LINE_NUM 8000000
#define EACH_THREAD_NUM 10000


long i,posF,posDB;
for (i=0;i<DB_NUM;i++) { lQueryPerDB[i] = 0; }
char *lQueryData = (char *)malloc(DB_NUM*MAX_LINE_NUM*sizeof(char));

lLineCount = lFileLen / lLineLen;
for (i=0;i<lLineCount;i++) {
    posF = i * lLineLen;
    iDB = get_DB(cFile[posF]);
    posDB = iDB * MAX_LINE_NUM + lQueryPerDB[iDB];
    lQueryData[posDB] = &cFile[posF];                   // this line have warning!!!!
    lQueryPerDB[iDB]++;
}
4

3 に答える 3

2

両方の場合char *、なぜ&演算子を使用しているのですか。言うだけ

lQueryData[posDB] = cFile[posF];
于 2012-12-15T05:24:52.050 に答える
2

の場合cFile、のchar *ようにインデックスを付けることcFile[posF]は、を行うことと同じです。または、「配列の先頭からの位置に*(cFile + posF)あるものの値を教えてください」。posF演算子のアドレス(&)は不要であり、そうでない場合は、おそらく必要なものとは逆になります(逆参照が必要です— *—これは下付き文字表記で自動的に行われます)。

他の人が示唆しているように、正しいコードはおそらく次のとおりです。

lQueryData[posDB] = cFile[posF];

特定の警告が表示される理由は、を使用すると、での文字&cFile[posF]のアドレス(つまり、へのポインタ)が取得されるためです。ただし、それを配列内の場所に割り当てようとすると、最初にそれを(内部的に)スカラー型にキャストする必要があります。ポインタは、メモリにインデックスを付ける単なる数値であるため、物事を「指す」以外の目的で使用される場合は、単なる整数です。したがって、あなたが持っているのは、明示的なキャストなしで、ポインタから整数を作成することです。cFileposFlQueryData

GCCにアクセスできる場合は、GCCの代わりにclangを使用してコンパイルすることを検討してください。これにより、はるかにアクセスしやすいエラーメッセージが表示されます。たとえば、上記のコードのエラーメッセージは次のとおりです。警告:整数変換への互換性のないポインタが「char*」型の式で「char」に割り当てられています。&を削除します(問題のある「&」記号への小さな視覚的なポインタを使用)。

于 2012-12-15T05:49:36.613 に答える
2

式 &cFile[posF] は値へのポインターであるため、次のように値を取得する必要があります。

lQueryData[posDB] = cFile[posF];
于 2012-12-15T05:24:10.870 に答える