我有一个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;
}
非常感谢。你帮我解决了这个问题。 – user246392 2010-04-15 23:52:06
(size * sizeof(list_node_t *))和(size * sizeof(list_node_t))之间的区别是什么?后者没有星号,我也注意到后者分配了更多的内存。 – user246392 2010-04-16 00:04:53
'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