2016-05-24 5 views
0

グローバル変数ソースから構造体のリンクリストを取り込もうとしていますが、strcpy()行にBAD_ACCESSがあります。 C.誰かが問題を指摘できるかどうか疑問に思う。EXC_BAD_ACCESS(コード= 1、アドレス= 0x0)

#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-> 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; 
} 

目の新鮮なセットを気に入ってください。よろしくです。 よろしくお願いします。

+0

は 'new_node-> data'のために割り当てられていません – BLUEPIXY

+0

割り当ては正しく' new_node = malloc(sizeof * new_node); '参照:[** mallocの結果をキャストしますか?**](http:// stackoverflow。 com/q/605845/995714)をご覧ください。 new_node-> data = malloc(sizeof *(new_node-> data)); '割り当てを決して忘れることのない方法の1つは、' create_node(...) '関数を書くことです。 'node'、および' data'中の割り当てを必要とするポインタがあります。 (パラメータとして 'list_init'に、' create_node'に初期化するために必要な値を渡します)。 'free_node'と' delete_list'も同じように動作します。 –

+0

'list_init'は、最初のノードアドレスを返してそれを呼び出し元関数のリストアドレスに戻さない限り、' list_init(list_t ** list、...) 'でなければなりません。どうして?最初のノードのアドレスは 'list'アドレスです。リストの*アドレス(つまり 'list_init(&list、...)')を渡さない限り、 'malloc'から返されたアドレスは決して' main'に反映されません(または 'list_init'の* type *が'list *'とあなたの戻り値と 'main'に最初のノードアドレスを割り当てます) –

答えて

1

文法上の注意:Cプログラミングの残りの部分では、通常、それぞれlist_node_tまたはListNode(スネーク表記とCamelCase)のいずれかを使用します。あなたの表記はいくらか混乱します。

List_node_tを割り当てていますが、その中のdataポインタは初期化されていません。あなたは幸運だった、そしてそれはNULLで、あなたは問題があることを知っていた。また、あなたのプログラムの中にランダムなアドレスがあったかもしれません。その後、のプログラムの動作は許容されます。

これも割り当てることができますが、これはあなたがしたいことではない可能性があります。私は2つの変更を行ってきた

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

:より良いアプローチはにList_node_tの定義を変更することです。最初の重要な点は、データをインライン化するように変更したため、1つの割り当てでデータとノードの両方が割り当てられることです。明らかに、コードの残りの部分にアクセスするための構文も調整する必要があります。

第2のものもまたスタイル的ですが、私は強くお勧めします。次へのポインタは正しく入力する必要があります。 struct定義内からtypedefにアクセスすることはできませんが、struct自体に名前でアクセスすることはできます。そのために、構造体に名前(typedefと同じ名前)を与え、それを使ってnextポインタをタイプしました。

+0

ポインタありがとうございます。私はいつも私のprofs表記法 "list_node_t"に従っていましたが、それが標準化されているとは考えていませんでした。私の最終的な解決策は、両方の提案のハイブリッドであった。 – Darrell

+0

@Darrellあなたの質問に答えたと思われる場合は、その横のチェックボックスをクリックして回答を受け入れてください。 –

関連する問題