2016-04-30 69 views
-2

我正在使用C語言。 我有一個指針,我想創建一個以地址開頭的新結構。這是我的方式來做到這一點,我可以通過編譯,但是當我運行它時,它會得到總線錯誤和段錯誤。如何根據給定的地址初始化一個結構?

struct node{ 
    int value; 
    int value2 
    struct node *next; 
} 

int main(){ 
    struct node a = {0, 0, NULL}; 
    void *p = (void*)(&a + 1); 
    struct node *ptr = (struct node *)(p); 
    //These two statements below cause the problem. 
    (*ptr).value = 100; 
    (*ptr).next = NULL; 
} 

有人可以幫我嗎?

+2

當然,我必須具有'some_method_to_get_address'的定義,因爲那是錯誤所在。 (順便說一下,'(* ptr).value)'通常寫成'ptr-> value')。 –

+0

我想你正在使用一個寄存器設置在給定地址的嵌入式系統?除了@AnttiHaapala所說的以外,你的(結構節點)也應該是(struct node *),你可能想轉換成addr_t中間值以確保你返回的「整數」作爲地址是適合的大小一個地址指針。 –

+0

@ c.fogelklou一個鏈表通常不會在一個設定的地址。 –

回答

1

試試這個,假設你只能使用靜態定義的內存,並希望鏈表:

struct node{ 
    int value; 
    int value2 
    struct node *next; 
}; 

#define LEN 10 
static struct node arr[LEN] = {0}; 

int main(){ 
    // Initialize the array of nodes 
    for (int i = 0; i < LEN; i++) { 
     struct node * const ptr = &a[i]; 
     ptr->value = 100; 
     ptr->next = (i == (LEN-1)) ? NULL : &a[i+1]; 
    } 
} 
1

在您的代碼p指向一個內存位置,它傳遞的地址是a,它是一個整數,但它是不確定的行爲來訪問它。

你想代替分配內存,例如:What:

struct node *ptr = malloc(sizeof *ptr); 

ptr->value = 100; 
ptr->next = NULL; 
+1

良好的評論,我也看到了這一點,但不想對此做出「回答」,因爲他發佈的代碼甚至不會編譯,因此永遠不會產生總線錯誤 - 因爲它甚至不會運行。 –

+0

我有更正它。這是一個錯字 – AATRSong

+0

@AATRSong'*(&a + 1)'仍然是UB。 – BLUEPIXY