EXC_BAD_ACCESS(代码= 1,地址= 0x0)

时间:2016-05-24 02:13:10

标签: c linked-list exc-bad-access strcpy

我正在尝试从全局变量源填充结构的链接列表,并在strcpy()行中获得BAD_ACCESS。使用C.想知道是否有人可以指出问题。

全局结构声明如下:

#include "data_structs.h"
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_LEN   256
#define NUL        '\0'

table_entry_t reg_list[]=
{
{"R0",0},{"PC",0},{"R1",1},{"SP",1},{"R2",2},{"SR",2},{"R3",3},
{"R4",4},{"R5",5},{"R6",6},{"R7",7},{"R8",8},{"R9",9},{"R10",10},
{"R11",11},{"R12",12},{"R13",13},{"R14",14},{"R15",15},{"R16",16}
};

... 结构看起来如此(下图)并在.h文件中定义。

typedef struct
{
    char label[20];
    int address;

}table_entry_t;

typedef struct
{
    table_entry_t *data;
    void *next;
} List_node_t;

typedef struct
{
    List_node_t *head;
}list_t;

使用以下内容初始化链接列表:(见下文)。 EXC_BAD_ACCESS出现在“strcpy(new_node-&gt; data-&gt; label,reg_list [i] .label)”行中;“

boolean List_init (list_t *list)
{
int all_ok = False;
int i=0;
char* temp[3];

if (list != NULL) {
    list->head = NULL;

    //Add Register Labels

    while(i<20)   // 20 register labels
    {
        List_node_t *new_node = NULL;    
        new_node = (List_node_t *) malloc( sizeof( List_node_t));
        strcpy(new_node->data->label,reg_list[i].label); <---BAD ACCESS
        new_node->data->address = reg_list[i].address; 
        new_node->next = list->head->next;
        list->head->next = new_node;
    }
    all_ok = True;
}
return all_ok;
}

欣赏新鲜的眼睛。 问候。

1 个答案:

答案 0 :(得分:1)

文体说明:C编程世界的其余部分通常使用list_node_tListNode(蛇符号和CamelCase)。你的记法有些令人困惑。

您正在分配List_node_t,但其中的data指针未初始化。你运气好了,它是NULL,你知道有问题。它也可能是您程序中的随机地址,之后任何程序行为都可以接受,包括您的程序是否显示了播放俄罗斯方块的3D窗口。

您也可以分配,但这可能不是您想要做的。更好的方法是将List_node_t的定义更改为:

typedef struct List_node_t
{
    table_entry_t data;
    struct List_node_t *next;
} List_node_t;

我做了两处修改。第一个也是重要的一点是我将数据更改为内联,因此一个分配分配数据和节点。显然,您还需要在其余代码中调整访问它的语法。

第二种也有点风格,但我强烈推荐它。应该正确键入指向next的指针。您无法从结构定义中访问typedef,但您可以按名称访问结构本身。为此,我给结构命名(与typedef相同),并使用它来键入next指针。