这是我的问题代码
#include <stdio.h>
#include <stdlib.h>
typedef struct _node Node;
typedef void* Data;
struct _node
{
Data* data;
Node *next;
};
typedef struct _singleLinkedList SingleLL;
struct _singleLinkedList
{
Node *head;
Node *tail;
Node *current; //not used in this example
};
typedef struct _partls
{
int x;
int y;
}Parts;
Node *addhead(SingleLL *list, Data* data)
{
Node *newnode = (Node*)malloc(sizeof(Node));
if(newnode == NULL)
return NULL;
newnode->data = data;
if(list->head == NULL)
{
newnode->next = NULL;
list->tail = newnode;
}
else
{
newnode->next = list->head;
}
list->head = newnode;
return newnode;
}
typedef void(*DISPLAY)(void*);
void displayparts(Parts* part)
{
puts("part_x\t\tpart_y");
printf("%d\t\t%d\n",part->x, part->y);
putchar('\n');
}
void displaySingleLinkedList(SingleLL *list, DISPLAY display)
{
Node *current;
for(current = list->head; current != NULL; current = current->next)
display(current->data);
}
void initSLList(SingleLL *list)
{
list->head = NULL;
list->tail = NULL; //not used in this example
}
int main(void)
{
puts("\nlinked list test code");
SingleLL *sLinkedList;
//create an object
Parts *part1 = (Parts*) malloc(sizeof(Parts));
if(part1 == NULL)
{
puts("NULL");
exit(1);
}
part1->x = 32;
part1->y = 98;
//create one more object
Parts *part2 = (Parts*) malloc(sizeof(Parts));
if(part2 == NULL)
{
puts("NULL");
exit(1);
}
part2->x = 42;
part2->y = 18;
initSLList(&sLinkedList);
addhead(&sLinkedList, part2);
addhead(&sLinkedList, part1);
displaySingleLinkedList(&sLinkedList, (DISPLAY) displayparts);
return 0;
}
问题: 这是一个测试代码,而不是一个完整的完美外观片段。它有缺陷。我确实尝试了调试器逐行调整...当执行displayparts函数时它会中断,调试器说:无法访问地址0x0的内存。虽然它应该是足够的信息,但我认为我的思绪已经停滞不前,我无法弄明白。
您能帮助发现导致代码崩溃的问题/问题的根源吗?我应该修改什么才能让它无误地工作?
答案 0 :(得分:4)
您的指针处理似乎已关闭,在多个位置。这里,
void initSLList(SingleLL *list)
main():
SingleLL *sLinkedList;
initSLList(&sLinkedList);
initSLList
被赋予指针sLinkedList
的地址,即指向指针的指针。
另外,你有
typedef void* Data;
Node *addhead(SingleLL *list, Data* data)
因为Data
是一个指针,addhead
需要一个指向指针的指针。
但是你给它一个指向零件结构的指针。
Gcc警告说要在六个不同的地方给出指向不兼容类型的指针。查看编译器具有的警告选项,并启用它们。
我建议非常谨慎地将指针指向不像指针的东西,只是为了避免像这样的混淆。但是在某些库接口中可能没问题。
答案 1 :(得分:1)
SingleLL *sLinkedList;
// ...
initSLList(&sLinkedList);
但是initSLList()
在SingleLL*
传递SingleLL**
时需要sLinkedList
。我认为你的意思是将SingleLL
声明为具体的-Wall
,而不是指向一个gcc
。
您应该使用设置为最详细级别的警告进行编译(Message Name: Ball
Field #1:
Name: Color
Type: unsigned int
Start Bit: 0
Bit Length: 4
Field #2:
Name: Radius
Type: single
Start Bit: 4
Bit Length: 32
Field #3:
Name: New
Type: bool
Start Bit: 36
Bit Length: 1
中的yum search python | grep devel
将执行此操作)。这可能会对此以及程序中的其他问题产生警告。这是一个伟大的,虽然可悲的不是万无一失的方式来保护自己免受C脚射击自己的极度轻松。