2017-08-25 95 views
-4

首先,我知道的元素是構建陣列沒有指針,它是壞的編碼,但行使其中的一部分,我不能改變陣列後INITIALISE得到BAD值[在C]

編輯:

typedef struct st 
{ 
    int id; 
    char *name; 
    int platforms; 
} *Station; 

我建立元件的陣列(結構) -

int num=X 
Station statTable= malloc((num)*(sizeof(*statTable))); 

並對其進行初始化 -

int i=0 
while(i<num){ 
    station=TS->stations+i*sizeof(*station); 
    station->name="blabla"; 
    station->id=id; 
    i++ 
} 

我檢查數組初始化和它的工作後,但後面的陣列上的一些迭代 -

int i=0; 
while(i<num){ 
    station=TS->stations+i*sizeof(*station); 
    printf("%d",station->id); 
    i++ 
} 

當TS是大結構體與指針站這是名稱爲站

我得到一個壞價值(下面的打印屏幕),它總是在第二個單元格中,有人有一個想法爲什麼發生? enter image description here

+5

MCVE,請。之間可能會發生太多事情(或不發生)。 –

+0

我知道,但在我的代碼初始化其剛剛打印 – Bizzu

+1

(MCVE =最小,完整,可驗證的例子,即實際編譯和可運行的東西)特別是考慮一些編碼風格的紅旗。 –

回答

1

typedefing指針並不是很好的做法。

代碼中的錯誤是指針算術。更確切地說這裏

station=TS->stations+i*sizeof(*station); 

,因爲我們知道添加1到指針會在內存中一個字節,但sizeof(typeItIsAppliedOn)字節打動我們,在這種情況下sizeof(Station)字節。

所以你寫的會很快讓你跳出界限,正如我們所知,訪問界限之外有未定義的行爲。

這應該修復它

station = TS->stations + i; // This will point to i-th station in memory 

一般情況下,你可以使用這個語義更好readbility

station = &TS->stations[i]; // Get an address of i-th element in array 
+0

但我想移動sizeof(*站),而不是sizeof(站),我知道它的最佳解決方案,但我不能使用數組指針 – Bizzu

+0

它與指針數組無關。您有簡單的結構數組,並希望循環遍歷每個結構並設置其名稱和ID。現在你正在超越界限。只需嘗試我的解決方案,並在兩個(寫作和閱讀)取代該行。 –

+0

當一個指針增加時,該偏移量就是指向的大小。換句話說,「++站」給出的結果是按一個「*站」的大小移動的。如果你不明白這一點,那麼當你使用指針時,你總是會搞砸的 - 就像你演示的那樣。 – Peter