我非常关注我的智慧。让这段代码工作(大部分)都很好。我通过执行“gcc -o selfRef selfRef.o”而不是“gcc -c selfRef.c”来编译它。不确定编译C文件的正确方法,但我开始得到分段错误错误,我似乎无法弄清楚如何解决它。
我在insert方法中插入了print语句,所以我知道代码在它中断之前甚至没有调用它。知道如何解决这个问题吗?
由于
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct Node
{
int value;
struct Node *next;
};
struct Node *head;
int main( int argc, char* argv[] )
{
#define True 1
#define False 0
typedef int Boolean;
struct Node *head = NULL;
int i;
printf("Your linked list:\n");
//inserts items into the list
for (i = 1; i < 20; i += 2)
{
insert(i,&head);
}
printList(head);
}
insert(int x, struct Node **pL)
{
printf("Inserts");
if(*pL == NULL)
{
struct Node *temp = (struct Node*)malloc(sizeof(struct Node));
(*pL) = temp;
(*pL) -> value = x;
(*pL) -> next = NULL;
}
else
{
insert(x,&((*pL) -> next));
printf("Inserts");
}
}
delete(int x, struct Node **pL)
{
if(*pL == NULL)
{
if(((*pL) -> value) == x)
{
(*pL) = (*pL) -> next -> next;
}
else
{
lookup(x, head -> next);
}
}
}
lookup(int x, struct Node *head)
{
if(head -> next == NULL)
{
return;
}
else if(head -> value == x)
{
return True;
}
lookup(x,(head) -> next);
}
printList(struct Node *head)
{
if(head == NULL)
{
printf("The list is empty");
return;
}
printf("Node: %s",head -> value);
printList(head -> next);
}
答案 0 :(得分:4)
您的运行时错误在printList函数的第127行附近。罪魁祸首是printf:
printf("Node: %s",head -> value);
您使用%s代替%d。 %s用于字符串。因此,printf的认为你有一个字符串和运行野生寻找一个空终止(strings in C are null terminated),但只给了一个int,所以它走了你的内存边界的,你会得到一个segfault。
此更改会导致程序正常完成:
printf("Node: %d",head -> value);
这看似微不足道,但是printf内存问题是经典的C.最臭名昭着的C漏洞是利用打印功能的缓冲区溢出。