2017-06-14 94 views
-2

我的代碼有另一個問題。我想用一個簡單的指針用法訪問所有3個值。但是我的指針跳得太遠了。 我的輸出是這樣的:使用指針訪問數組的兩個結構

  1. 值爲1

  2. 值是4194432

  3. 值是2686824

我想,我的問題是,我的指針來自錯誤的類型。所以,指針++不會跳轉到下一個數組元素。我真的不知道,我怎麼能解決這個問題。 (這只是一個簡單的例子來重現我的問題,所以不要找感覺在做這個)

typedef struct _A { 
int value; 
}A; 

typedef struct _B { 
A array[10]; 
}B; 

int main() 
{ 
    A atest; 
    B btest; 
    B *p=NULL; 

    btest.array[0].value=1; 
    btest.array[1].value=3; 
    btest.array[2].value=5; 

    p=malloc(10 * sizeof(btest)); 
    p=&btest.array; 
    int i=0; 

    for(i=0;i<3;i++) 
    { 
     printf("\n%d. Value is %d\n",i+1,p++->array->value); 
    } 

    return 0; 
} 

THX閱讀,如果事情是在我的解釋失蹤的話,我會道歉,並添加它。

編輯:

此外,以一些程序員多德Sollution,我添加了一個簡單的鑄件機械:

q=(A*) p; 
    q++; 
    p =(B*)q; 

THX對您有所幫助:)

+0

以undewrscore開頭的名稱保留用於所有名稱空間的文件作用域實現!無論如何,像「A」這樣的名字都是不合適的。 – Olaf

回答

1

這些線

p=malloc(10 * sizeof(btest)); 
p=&btest.array; 

包含兩個問題。第一個是在第二個任務中你輸了你分配的內存。它不復制btest.array的內容。

的第二個問題是,p是指向B&btest.array是指向十個A元件(其類型是A (*)[10])的陣列。這兩個是不同的類型。

如果你想btest複製到分配給p(這是一個指向 B結構是有點矯枉過正)內存做例如

p=malloc(sizeof *p); 
memcpy(p, &btest, sizeof *p); 

然後到下一個問題

p++->array->value 

p++將使p指向下一個元素的數組指向p,但這是錯誤的。您應該循環播放p->array,而不是像

p->array[i].value 
+0

Thx爲您的幫助和解釋工作,一些程序員哥們。即使你有所改善,我的結果也是錯誤的。我知道,我的數組的類型是A,但是因爲它指向B,我感到惱火。我嘗試在它增加之前使用一個強制轉換,然後在它之後重新轉換。 –

+0

隨着你的改進和一點點投我的問題就解決了:) thx一些程序員老兄! –