2012-05-12 4 views
0

回答:変数を正しく初期化していませんでした。私は、ポインタの宣言はC.Cコンパイラエラー - 警告:割り当ては、キャストのないポインタから整数を生成します。エラー:添え字付きの値が配列でもポインタでもありません

にこのコードのチャンクをどのように機能するかを覚えておく必要が

はの形式でいくつかのコマンドライン引数に取るようになっている:

./foo 1 2 3 4 5 6 7 8 9 10 ... (any reasonable number of arguments so long as they're divisible by 5

私の計画は、5を持っていることです後でロジックで使用するために引数を格納するint型の可変長配列。したがって、引数が10個ある場合は、2つの2-int配列を持つことになります。

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 

を取得し、私は彼らがあるかを表すことになっているものは考えている、です。私はそれを見て、今まで何も助けていない。私は皆ができることを望んでいた。

EDIT:レコードのために、26〜30行目と33〜37行目をコメントアウトしてみました。私は後世のためにそれを加えたいと思っただけです。

+0

すでに回答がありましたので、もう少しヒント - あなたはあまりにも少ないメモリを割り当てていませんか?バイト単位で、sizeof(int)を掛けなければなりません。おそらく – keltar

+0

。問題を修正しようとしたときに早めに変更しました。 – BigDamnHero

答えて

6

をこの:

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

はこれと同じです

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

あなたが欲しいのは:

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

もっと一般的には、同じ行に複数の変数を宣言しないようにしてください。宣言は次のようになりますC言語の面では

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; 
+0

これはうまくいくかもしれませんが、しばしばtypedefの後ろにポインタを隠すことは悪い習慣とみなされます。 –

+0

@OliCharlesworthはいtypedefsは、基本的な型に対してのみ使用されるべきです。したがって、それらに 'const'と' * 'を自由に適用することができます。 – Nobody

1

、:

type-specifier declaration-specifiers; 

タイプ指定子は、あなたの場合には、それはintで、唯一のタイプです。これには、の宣言指定子と、宣言子のコンマで区切られたリストが続きます。宣言子は、それが宣言する識別子だけでなく、*,[]()のすべてを含み、その宣言をその用途のように見せます。この説明で、それはそれはintへのポインタである*IP1、だし、残りはint型として宣言されているあなたは

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

と宣言するもの明らかになる。 これは、なぜベテランCプログラマは、どちらか

  • が宣言子に識別子に向け*を移動するために一つの理由行あたり
  • 宣言ちょうど1つの識別子が

これは私が書くでしょうかれるお勧めします宣言:

int *IP1, *IP2, *BID, *PN, *EID; 
関連する問題