EXC_BAD_ACCESS(代码=1,地址=0x0)
EXC_BAD_ACCESS(code=1, address=0x0)
我正在尝试从全局变量源填充一个结构链表,我在 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 '[=11=]'
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->data->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;
}
欣赏新鲜的眼睛。
问候。
文体注释:C 编程世界的其余部分通常使用 list_node_t
或 ListNode
(分别为蛇形表示法和驼峰命名法)。你的符号有点混乱。
您正在分配 List_node_t,但其中的 data
指针未初始化。你走运了,它是 NULL,你知道有问题。它也可能是您程序中的一个随机地址,之后 任何 程序行为都是可以接受的,包括如果您的程序显示 3D window 玩俄罗斯方块。
你也可以分配它,但这很可能不是你想要做的。更好的方法是将 List_node_t 的定义更改为:
typedef struct List_node_t
{
table_entry_t data;
struct List_node_t *next;
} List_node_t;
我做了两项更改。第一个也是重要的一个是我将数据更改为内联,因此一次分配同时分配了数据和节点。显然,您还需要在其余代码中调整访问它的语法。
第二个也有点文体,但我强烈推荐它。指向 next 的指针应该正确键入。您不能从结构定义中访问 typedef,但可以通过名称访问结构本身。为此,我给结构命名(与 typedef 相同),并用它来键入 next
指针。
我正在尝试从全局变量源填充一个结构链表,我在 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 '[=11=]'
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->data->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;
}
欣赏新鲜的眼睛。 问候。
文体注释:C 编程世界的其余部分通常使用 list_node_t
或 ListNode
(分别为蛇形表示法和驼峰命名法)。你的符号有点混乱。
您正在分配 List_node_t,但其中的 data
指针未初始化。你走运了,它是 NULL,你知道有问题。它也可能是您程序中的一个随机地址,之后 任何 程序行为都是可以接受的,包括如果您的程序显示 3D window 玩俄罗斯方块。
你也可以分配它,但这很可能不是你想要做的。更好的方法是将 List_node_t 的定义更改为:
typedef struct List_node_t
{
table_entry_t data;
struct List_node_t *next;
} List_node_t;
我做了两项更改。第一个也是重要的一个是我将数据更改为内联,因此一次分配同时分配了数据和节点。显然,您还需要在其余代码中调整访问它的语法。
第二个也有点文体,但我强烈推荐它。指向 next 的指针应该正确键入。您不能从结构定义中访问 typedef,但可以通过名称访问结构本身。为此,我给结构命名(与 typedef 相同),并用它来键入 next
指针。