我正在尝试用C编写一个简单的列表,它可以存储数字
使用数字SIZE
,将计算索引,并且数字必须存储在数组索引处的一种线性列表中。
但是,有时候我会得到一个“分段错误”,就像10次尝试中的2次一样,输出是正确的
我已经进行了长时间的搜索,但我找不到问题
请记住,我的“解决方案”没有完全实现,所以目前它只在计算的索引没有存储指针时才有效。 (由于错误,无法继续编码。)
这是我的代码:
#define SIZE 3
#define NULL 0
typedef struct node_s node_t;
struct node_s {
node_t* next;
int number;
};
static node_t nodeArray[SIZE];
int addNumber(int numb){
int index = number % SIZE;
if(nodeArray[index].next == NULL){
node_t* node = (node_t*) malloc(sizeof(node_t));
node->number = number;
nodeArray[hash].next = node;
}
}
void print(){
for(int i = 0; i < SIZE; i++){
node_t* ptr = nodeArray[i].next;
while(ptr != NULL){
printf("%d -> ", ptr->number);
ptr = ptr->next;
}
printf("\n");
}
}
#include "dictionary.h"
#include <stdio.h>
int main(){
insert(1);
insert(2);
print();
return 0;
}
有时导致“分段错误”的原因是什么? 我很感激任何帮助,提前谢谢!
答案 0 :(得分:5)
在malloc之后,你做一个成员。
node->number = number;
但是你没有初始化其他成员,没有
node->next = NULL;
此外,在print()
内的循环条件中,您检查ptr是否为NULL,但这是在大多数循环中未初始化的ptr->接下来的循环。
ptr = ptr->next;
即。你依靠它初始化为NULL 这可能导致了段错误。
有用的背景,正如yano所指出的(谢谢):
Malloc没有将内存初始化为0.为了做到这一点,你可以使用malloc后跟memset,或者你可以使用calloc。