最近开始练习链表。我知道LL的基本算法和概念,并想过实现LL来存储用户输入的一堆字符串。
但很明显,我一直得到Segmentation fault
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _node{
char *s;
struct _node *next;
}
node;
int main()
{
node *head = NULL;
int a = 0;
char ch;
char *str = malloc(10);
do
{
printf("nDude %i:", a);
fgets(str, 10, stdin);
node *n = malloc(sizeof(node));
if(n == NULL)
{
printf("ninsufficient memory");
return 1;
}
if(a == 0)
{
strcpy(n->s, str);
n->next = NULL;
head = n;
}
else
{
strcpy(n->s, str);
n->next = head;
head = n;
}
a++;
printf("n continue?(y/n): ");
scanf("n%c", &ch);
}while(ch == 'y');
for(node *temp = head; temp != NULL; temp = temp -> next)
{
printf("n%s", temp->s);
}
return 0;
}
我确实理解我的逻辑/代码在某个地方有缺陷,因为我正在触摸我不应该触摸的记忆,但似乎无法指出哪里,因为这是我第一次处理链表。
当malloc
为struct
分配空间时,只为指向_node
结构中字符串的指针分配空间。在执行strcpy
之前,您需要在存储字符串的位置分配一些内存,并将指针s
指向它。即
n->s = malloc(sizeof(char)*100);
请记住,您还需要有一个策略来取消分配此内存。
正如其他人所暗示的那样,使用gdb
查找/调试通常很容易发现这类错误。请记住,使用-g
标志进行编译以获得有用的调试信息是非常有用的。
捕获"分段错误"的原因是,在复制实际字符串strcpy(n->s, str)
之前,没有为结构体node
的s
变量分配内存。因此,为s
:分配内存
n->s = (char *) malloc(10 * sizeof(char));
请注意,不能将任何内容写入未分配的空间,因此需要为每个节点中的字符串调用malloc
。如果字符串长度是固定的,则可以在struct node
的定义中指定长度,以避免malloc
问题。
此外,建议始终free
将不再被引用的对象。
通过一些修订,以下代码可能会有所帮助:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 10
typedef struct node {
char str[LEN];
struct node *next;
} Node;
int main() {
Node *head = NULL;
int n = 0;
char c = 'y';
while (c == 'y') {
Node *node = malloc(sizeof(Node));
printf("Node #%d: ", n);
scanf(" ");
/* Store the string directly into the node. */
fgets(node->str, 10, stdin);
/* Remove the newline character. */
node->str[strcspn(node->str, "n")] = 0;
node->next = head;
head = node;
++n;
printf("Continue? (y/N): ");
scanf("%c", &c);
};
Node *curr = head;
while (curr != NULL) {
printf("%sn", curr->str);
Node *temp = curr;
curr = curr->next;
/* Remember to free the memory. */
free(temp);
}
return 0;
}