0

cc を使用してコンパイルされた長いファイルに C コードがあります。しかし、gcc でコンパイルしようとすると、エラーが発生します。その特定のコードを小さなプログラムで取り、ccでコンパイルしようとしましたが、そこで失敗しました。

ソースは次のとおりです。

#include <stdio.h>
int main (int argc, char **argv)
{
     char unsigned   FileName[100];
     char            test[100];
     FileName[strstr(FileName,test) - FileName] = 0;   
     return 0;
}

この行が問題を引き起こしています: FileName[strstr(FileName,test) - FileName] = 0;

CC のエラーは次のとおりです。

"foo.c", line 10: operands have incompatible types:
         int "-" pointer to unsigned char

そしてgccでは:

foo.c:10: error: invalid operands to binary - Both are same.

しかし、CCで元のファイルをコンパイルすると、コンパイルされて警告が表示されます。このような:

"dbtprc.c", line 643: warning: argument #1 is incompatible with prototype:
        prototype: pointer to const char : "/usr/include/iso/string_iso.h", line 133
        argument : pointer to unsigned char
"dbtprc.c", line 643: warning: improper pointer subtraction

ここで「不適切なポインター減算」という警告が表示され、サンプルプログラムがエラーを表示している理由を教えてください。

4

4 に答える 4

1
void * bar;
void * foo;
...
foo = bar + 1;

それは未定義の動作です。割り当てさえされていないメモリの場所を参照しています。

編集

ここで、別の問題があります。両方の配列を正常に宣言したにもかかわらず、それらを消去/初期化できませんでした。strstr()何が返ってくるかは神のみぞ知る。

このコードをコンパイルする際の問題は、strstr() が 2を取り、 Filenameを unsigned としてconst char*定義したことです。char unsigned FileName[100];

char *strstr(const char *haystack, const char *needle);

于 2011-03-29T16:38:51.597 に答える
1

入れ忘れていません<string.h>か??

はいの場合、strsrt のプロトタイプが推測され、デフォルトで int が返されるため、ポインター操作が無効になります。

それ以外の場合、署名の不一致が警告/エラーの原因であるように見えます。(char*)テーブルが 2 つ出現する前にキャストを使用すると、それが実行されます。

于 2011-03-29T16:45:38.957 に答える
1

に配列演算と呼ばれるものはありCますか? これを読む:

配列は Pointers ではありません

また、 strstr()の使用方法を参照してください。

于 2011-03-29T16:54:03.363 に答える
0

エラーまたは警告はそれほど違いはなく、コンパイラが問題をどれだけ深刻に考えているかを示しているだけです。

しかし、なぜunsigned charファイル名に使用するのですか? これは、パラメーターと戻り値の型の両方について、strstrwhich only handlesと競合しています。char*

それが、コンパイラがさまざまな方法で伝えようとしていることです。

于 2011-03-29T16:51:44.097 に答える