我正在尝试使用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 的需要。