2012-05-12 43 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個參數,我會有5個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 

而且我不知道他們應該做的是或代表。我查看了它,迄今爲止沒有任何幫助。我希望你們都可以。

編輯:對於記錄,我試着註釋掉行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; 

但更一般地說,儘量避免在同一行中聲明多個變量。

1

您的變量IP2, BID, PN, EID只有類型int而不是int*。你必須在每個人面前寫上*

您的方法存在的問題是*僅與其正下方的變量綁定。所以

int *intptr, intvar; 

創建的指針intint類型的變量。有兩個指針,你應該寫:

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

在C語言方面,聲明如下:

type-specifier declaration-specifiers; 

類型說明符是一個孤獨的類型,你的情況是int。接下來是聲明指定符,逗號分隔列表聲明符。聲明符不僅包含聲明的標識符,還包含所有的*,[](),以使其聲明看起來像它的用法。這個解釋可以很明顯你有

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

聲明這是一個*IP1,這是一個指針爲int,其餘被聲明爲整數。 這是一個原因,爲什麼經驗豐富的C程序員建議要麼

  • 移動*朝標識符在聲明符
  • 申報只是一個每行標識符

這是我會怎麼寫聲明:

int *IP1, *IP2, *BID, *PN, *EID; 
相關問題