最近我一直在练习数据结构,但遇到了一个新问题,当我尝试打印列表时,它提示“核心转储”,我感到困惑!!
我宣布:
struct DOUBLE_LINK_LIST {
char *string;
struct DOUBLE_LINK_LIST *pre;
struct DOUBLE_LINK_LIST *next;
}double_link_list;
linklist.h:
/* double linked list */
struct DOUBLE_LINK_LIST *init_double_link_list() {
struct DOUBLE_LINK_LIST *new_link = malloc(sizeof(struct DOUBLE_LINK_LIST));
if (new_link==NULL) {
fprintf(stderr, "Insufficient memory!!!");
return NULL;
}
new_link->string = NULL;
return new_link;
}
============================== 这是我得到的长度:
int D_get_length(struct DOUBLE_LINK_LIST *link) {
int count;
count = 0;
while (link->next!=NULL) {
count += 1;
link = link->next;
}
return count;
}
int D_create(struct DOUBLE_LINK_LIST *link, char *in) {
if (D_get_length(link)>=STRING_SIZE) {
fprintf(stderr, "Double link list is full!!!");
return ERROR;
}
else {
struct DOUBLE_LINK_LIST *new_node;
new_node = init_double_link_list();
if (new_node==NULL) {
return ERROR;
}
/*new_node->next = link->next;
new_node->pre = link;
link->next = new_node;
if(new_node->next!=NULL) {
new_node->next->pre = new_node;
}
new_node->string = in;*/
new_node->next = link->next;
link->next = new_node;
new_node->string = in;
}
return OK;
}
它确实返回正确的长度,但它不在create函数中:
char *D_get_element(struct DOUBLE_LINK_LIST *link, int pos) {
int i;
if (D_is_empty(link)==YES) {
return NULL;
}
printf("_%d_", D_get_length(link));
if (pos <= 0 || pos-1 > D_get_length(link)) {
fprintf(stderr, "Invalid position!!!");
exit(1);
}
else {
for (i = 0; i < pos; ++i) {
link = link->next;
}
}
return link->string;
}
答案 0 :(得分:1)
问题是第一个DOUBLE_LINK_LIST
已创建,我假设您还使用init_double_link_list
创建了第一个malloc
。因为您只执行next
而不清除已分配的内存,所以D_create
指针上有一些垃圾。
然后我假设你开始将字符串推入其中,因为你的next
将坏calloc
移动到新的memset
中,这个错误的指针被推到列表的末尾。
然后在某些时候你的意志会走向未知的土地并且死得很厉害,或者如果你运气不好,它会工作一段时间然后再次死亡。
一个解决方案:使用malloc
,它将使用0初始化内存。
其他解决方案:{{1}}之后的{{1}}
更多解决方案:null旁边的显式设置
答案 1 :(得分:-1)
编译调试信息并使用Valgrind