从链表中的指针存储字符串

Storing strings from pointers in Linked lists

最近开始练习链表。我知道基本算法和概念,并想到实现 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;
}

我明白我的 logic/code 在某个地方有缺陷,因为我正在触及我不应该触及的内存,但似乎无法指出哪里,因为这是我第一次处理链表。

当您 mallocstruct 设置 space 时,您只是为指向 _node 中的字符串的指针分配 space结构。在执行 strcpy 之前,您需要在存储字符串的位置分配一些内存并将指针 s 指向它。 即

n->s = malloc(sizeof(char)*100);

请记住,您还需要有一个策略来取消分配此内存。

正如其他人所暗示的,这类错误通常很容易被 looking/debugging 和 gdb 捕获。请记住,使用 -g 标志进行编译以获得有用的调试信息很有用。

你捕获 ''Segmentation fault' 的原因是因为在复制实际字符串 strcpy(n->s, str) 之前,你没有为结构 nodes 变量分配内存:strcpy(n->s, str)。 因此,为 s:

分配内存
n->s = (char *) malloc(10 * sizeof(char));

请注意,您不能将任何内容写入未分配的 space,因此您需要为每个节点中的字符串调用 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("%s\n", curr->str);
        Node *temp = curr;
        curr = curr->next;

        /* Remember to free the memory. */
        free(temp);
    }

    return 0;
}