gpt4 book ai didi

C 单链表使用 gcc 但不使用 dcc 出现段错误

转载 作者:行者123 更新时间:2023-12-04 04:12:46 26 4
gpt4 key购买 nike

Added screenshot with output and example txt file我正在尝试将 txt 文件中的单词读入单链表并显示该列表。

我编译使用:gcc -Wall -lm -std=c11 *.c -o showList(我有其他 c 文件),当我运行 时出现段错误。/显示列表

但是,如果我使用以下编译,列表显示正常且没有段错误:dcc -Wall -lm -std=c11 *.c -o showList

我是 C 的新手,这让我很困惑,非常感谢任何帮助或建议!

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
#include <err.h>
#include <sysexits.h>
#include <math.h>

typedef struct ListNode *List;
typedef struct ListNode {
char *data;
struct ListNode *next;
}ListNode;

List getListFromFile(void);
void showList (List L);
List listInsert (List L, char *word);

int main (int argc, char **argv){
List list = getListFromFile();
showList(list); //seg fault here?
}

List getListFromFile(void) {
List newList = NULL;
FILE *txtFile;
txtFile = fopen("someRandom.txt", "r"); // word1 word2 word3 word4
if(txtFile == NULL){
fprintf(stderr,"Error opening txt\n");
return NULL;
}
char word[100];
while(fscanf(txtFile, "%s", word) != EOF){ //read from txt file and store words into list
printf("%s ", word); // testing
newList = listInsert(newList, word);
}
fclose(txtFile);
return newList;
}

void showList (List L){
if (L == NULL) return;
while (L != NULL) {
printf("%s ", L->data);
L = L->next;
}
printf("\n");
}

static ListNode *newListNode (char *word) {
ListNode *n = malloc (sizeof (*n));
if (n == NULL) err (EX_OSERR, "err creating node \n");
n->data = strdup (word);
n->next = NULL;
return n;
}

List listInsert (List L, char *word){ //insert at head
ListNode *n = newListNode(word);
if (L == NULL) {
return n;
} else {
n->next = L;
return n;
}
}

最佳答案

首先,您的程序在提供的屏幕截图中已被 gcc 诊断出错误。您不应该尝试运行有此类问题的程序;而是解决问题。

这些是错误情况,因为您的代码不符合 ISO C11。因此,程序的运行时行为没有以任何方式定义。一些编译器不会通过将此类情况描述为“警告”来让初学者的生活变得轻松。


显示的问题是函数 strdup 被调用,它不在 ISO C11 中,但您使用了 -std=c11 标志。如果“dcc”编译器没有为此调用提供诊断消息,则它是不合格的。

可能的修复是:

  • 使用包含 strdup 的不同一致性模式,例如-std=gnu11
  • 手动原型(prototype)化 strdup(不推荐,但正确的形式是:char * strdup(const char *str1);)
  • 不要使用strdup;而是使用 malloc 后跟 strcpy
  • #define _XOPEN_SOURCE 700 作为源文件的第一行,这将覆盖该文件的 -std=c11

关于C 单链表使用 gcc 但不使用 dcc 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61434692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com