0

回答:変数を適切に初期化していませんでした。

Cでポインタ宣言がどのように機能するかを覚えておく必要があります。

このコードのチャンクは、次の形式のコマンドライン引数を受け取ることになっています。

./foo 1 2 3 4 5 6 7 8 9 10 ...(5で割り切れる限り、任意の数の引数

私の計画では、後でロジックで使用するための引数を格納するために、可変サイズの5つのint配列を用意する予定です。したがって、引数が10個ある場合、2整数配列は5個になります。

int* IP1, IP2, BID, PN, EID;
int i;

if((argc < 2) || ((argc-1) % 5) != 0)
{ 
   /* Some error statements */
}

IP1 = (int*)malloc(argc-1);
IP2 = (int*)malloc(argc-1);  //This is line 26
BID = (int*)malloc(argc-1);
PN = (int*)malloc(argc-1);
EID = (int*)malloc(argc-1);

for(i = 0; i < argc-1; i+=5){
  IP1[i] = argv[i+1];
  IP2[i] = argv[i+2];        //This is line 33
  BID[i] = argv[i+3];
  PN[i] = argv[i+4];
  EID[i] = argv[i+5];
  printf("%d\t", i);
}

問題は、これらの奇妙なエラーが発生することです

>cc foo.c -o foo
foo.c: In function ‘main’:
foo.c:26: warning: assignment makes integer from pointer without a cast
foo.c:27: warning: assignment makes integer from pointer without a cast
foo.c:28: warning: assignment makes integer from pointer without a cast
foo.c:29: warning: assignment makes integer from pointer without a cast
foo.c:33: error: subscripted value is neither array nor pointer
foo.c:34: error: subscripted value is neither array nor pointer
foo.c:35: error: subscripted value is neither array nor pointer
foo.c:36: error: subscripted value is neither array nor pointer

そして、私は彼らが何であるか、または表すことになっているのか分かりません。私はそれを調べましたが、これまでのところ何も役に立ちませんでした。私はすべてができることを望んでいた。

編集:レコードのために私は26-30行目と33-37行目をコメントアウトしようとしました、そしてそれはうまくコンパイルされます。後世のためにそれを追加すると思っただけです。

4

3 に答える 3

6

これ:

int* IP1, IP2, BID, PN, EID;

これと同じです:

int *IP1;
int IP2;
int BID;
...

あなたはこれを求めている:

int *IP1, *IP2, *BID, *PN, *EID;

ただし、より一般的には、同じ行で複数の変数を宣言しないようにしてください。

于 2012-05-12T10:04:31.177 に答える
1

変数のIP2, BID, PN, EID型は。でintはありませんint*。あなたはそれらのそれぞれの前に書く必要が*あります。

あなたのアプローチは、*その真下にある変数にのみバインドするという問題に悩まされています。それで

int *intptr, intvar;

intとタイプの変数へのポインタを作成しますint。両方のポインタを使用するには、次のように記述します。

int *intptr, *intptr2;
//for more clarity
int *intptr;
int *intptr2;

または代わりに(しかしコメントを読んでください!):

typedef int* intptr;
intptr IP1, IP2, BID, PN, EID;
于 2012-05-12T10:04:18.150 に答える
1

C言語の用語では、宣言は次のようになります。

type-specifier declaration-specifiers;

タイプ指定子は単独のタイプであり、あなたの場合はですint。この後に、宣言指定子、宣言子のコンマ区切りリストが続きます。宣言子は、宣言する識別子だけでなく、すべての*[]含み()、宣言をその使用法のように見せるために構成されています。この説明で、あなたが何を宣言するかが明らかになります

int* IP1, IP2, BID, PN, EID;

これ*IP1はintへのポインタであるであり、残りはintとして宣言されます。これが1つの理由であり、経験豊富なCプログラマーがどちらかを推奨する理由です。

  • *宣言子の識別子に向かって移動します
  • 1行に1つの識別子のみを宣言します

これは私が宣言を書く方法です:

int *IP1, *IP2, *BID, *PN, *EID;
于 2012-05-12T10:18:32.873 に答える