C语言 为什么打印链表的内容时出现分段错误



我正在尝试使用C中的链表实现堆栈式结构。 最终它将从输入文件中读取不同长度的字符串,因此需要动态内存。我在打印列表中的 printf 上遇到分段错误,我无法弄清楚原因。我之前在推送中也遇到了分段错误,但我似乎已经修复了它们。如果不是很明显,我的目的是仅将元素添加到列表的"顶部"。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void* emalloc(size_t n);
typedef struct node {
    struct node* next;
    char* word;
} node;
node* head = NULL;
void* emalloc(size_t n) {
    void* p;
    p = malloc(n);
    if(p == NULL) {
        fprintf(stderr, "Failed to allocate memory.");
        exit(1);
    }
    return p;
}
void push(char* w) {
    if(head == NULL) {
        head = (node*) emalloc(sizeof(node));
        head->word = (char*) emalloc(strlen(w) * sizeof(char) + 1);
        strncpy(head->word, w, strlen(w) + 1);
        printf("Pushed a word to head.");
        return;
    }
    node* newnode = (node*) emalloc(sizeof(node));
    newnode->word = (char*) emalloc(strlen(w) * sizeof(char) + 1);
    strncpy(newnode->word, w, strlen(w) + 1);
    newnode->next = head;
    head = newnode;
}
void printList() {
    node* cur = head;
    if(cur == NULL || cur->word == NULL) printf("Whoops!");
    while(cur != NULL) {
        printf(cur->word);
        cur = cur->next;
    }
}

/*
 * The encode() function may remain unchanged for A#4.
 */
void main() {
    char word[20] = "Hello world";
    //push("Hello",head);
    //push("World",head);
    //push("!",head);
    push(word);
    printList();
}

为什么要复制到 push(( 中字符串的 1 个末尾? 此外,如果字符串太长,strncpy 不会为您 NUL 它。

真正的崩溃是在"Head"创建中,当不存在条目时,第一个if语句。 它不会给下一个指针 NULL 因此,当它在列表末尾读取垃圾指针时,列表遍历将在最后一个条目上爆炸。

它对我有用,因为迈克尔·多根问你为什么在字符串末尾过了 1 个字节。

我建议使用类似的东西:

int len =strlen(w)

以前

node* newnode = (node*) emalloc(sizeof(node));
newnode->word = (char*) emalloc(len * sizeof(char));
strncpy(newnode->word, w, len)[len]=0;
newnode->next = head;

此时间变量消除了在这些位置上使用 strlen 的需要。

相关内容

  • 没有找到相关文章

最新更新