2016-04-30 48 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