2010-04-15 40 views
0

我有一個C作業。它比下面顯示的代碼長很多,我們只給出函數原型和指令。我在編寫代碼方面盡了我的最大努力,但我陷入了分段錯誤。當我在Linux上編譯和運行下面的程序時,在「735 NaN」時它將終止,表示發生了段錯誤。爲什麼?我究竟做錯了什麼?基本上,程序不會讓我訪問table-> list_array [735] - > value和table-> list_array [735] - >鍵。這當然是第一段錯誤。可能有更多的跟隨在table_allocate一個局部變量(nodes),它就會消失指數735如何防止我的程序中發生分段錯誤?

#include <stdio.h> 
#include <stdlib.h> 

typedef struct list_node list_node_t; 

struct list_node 
{ 
    char *key; 
    int value; 
    list_node_t *next; 
}; 

typedef struct count_table count_table_t; 

struct count_table { 
    int size; 
    list_node_t **list_array; 
}; 


count_table_t* table_allocate(int size) 
{ 
    count_table_t *ptr = malloc(sizeof(count_table_t)); 

    ptr->size = size; 

    list_node_t *nodes[size]; 

    int k; 

    for(k=0; k<size; k++){ 
     nodes[k] = NULL; 
    } 

    ptr->list_array = nodes; 

    return ptr; 
} 

void table_addvalue(count_table_t *table) 
{ 
    int i; 

    for(i=0; i<table->size; i++) 
    { 
     table->list_array[i] = malloc(sizeof(list_node_t)); 
     table->list_array[i]->value = i; 
     table->list_array[i]->key = "NaN"; 
     table->list_array[i]->next = NULL; 
    } 
} 

int main() 
{ 
     count_table_t *table = table_allocate(1000); 
     table_addvalue(table); 

     int i; 

     for(i=0; i<table->size; i++) 
      printf("%d %s\n", table->list_array[i]->value, table->list_array[i]->key); 

     return 0; 
} 

回答

2

你點ptr->list_array當函數返回時,留下了懸擺指針。你可能想要

list_node_t **nodes = malloc(size * sizeof(list_node_t *)); 
+0

非常感謝。你幫我解決了這個問題。 – user246392 2010-04-15 23:52:06

+0

(size * sizeof(list_node_t *))和(size * sizeof(list_node_t))之間的區別是什麼?後者沒有星號,我也注意到後者分配了更多的內存。 – user246392 2010-04-16 00:04:53

+0

'list_node_t *'指向一個指針 - 指向任何類型的指針的大小隻取決於你的機器/編譯器,通常是32位或64位(它本質上只是一個整數)。 'sizeof(list_node_t)'足以容納'list_node_t'實例的大小,對於'list_node_t'的所有成員加上一些填充(如果適用的話)就足夠了。在這裏'sizeof(char *)+ sizeof(int)+ sizeof(list_node_t *)'' – 2010-04-16 00:12:15

1

我建議常規使用valgrind(1)以防止發生這樣的問題。