C: Segmentation Fault -- 堆栈实现链表

标签 c pointers linked-list segmentation-fault stack

该程序比较简单,只是假设接收一个以分号分隔的值/字符串/行的文本文件,将值的顺序反转,将它们全部放回一起,然后输出到一个新文件。但是,有规范要求我们必须使用实现简单链表数据结构的堆栈。我是 C 的新手,只是在学习指针的基础知识(我来自 Java 和 .NET,这对我来说是一场噩梦,大声笑)。此外,规范明确指出 push() 函数必须接受“旧栈顶(节点)”和“要推送的值”,并将更新后的指针返回到栈顶。此外,pop() 必须将“指向当前堆栈顶部的指针的指针”作为参数,并返回弹出节点的值。

我们假设用 gcc -o progname progname.c -Wall -m32 -O 编译。源代码编译得很好,但是当尝试使用实际示例文件构建堆栈等时,我收到了段错误。然而,我已经通过 gdb 运行了我的代码,它说在我的“push((values -> head), str1);”处发生了段错误。在 main() 中调用。由于这是对 push() 的调用,我猜我在链表和/或堆栈中忽略了更基本的逻辑错误。

在这一点上,我已经用尽了我的大脑,并且终生无法弄清楚我哪里出了问题。如果有人能为我提供一些帮助,我将永远感激不已。

此外,如果某些代码看起来很丑陋,我深表歉意。我现在只使用 C 语言工作了大约 2 周

示例输入文件为:

23414;-5224;23;569;

预期的输出文件是:

569;23;-5224;23414;

这是我到目前为止开发的内容:

#include <stdio.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>

int STACK_ELEMENTS = 0;

typedef struct node {
    char *value;
    struct node *next;
} Node;

typedef struct my_stack {
    Node *head;
} Stack;

Stack *values;

bool stack_isEmpty() {
    if (STACK_ELEMENTS < 1)
        return true;
    else
        return false;
}

Node *push(Node *oldHead, char *val) {
    Node *newNode;
    newNode = malloc(sizeof(Node));
    newNode -> value = val;    

    if (oldHead == NULL) {
        values -> head = newNode;
        values -> head -> value = val;
    }

    else {
        values -> head -> next = newNode;
        values -> head = newNode;
    }
    free(newNode);
    STACK_ELEMENTS++;
    return (values -> head);
}

char *pop(Node **pHead) {
    char *val;
    if ((*pHead) != NULL) {
        Node *tempNode;
        tempNode = malloc(sizeof(Node));
        tempNode = *pHead;
        val = tempNode -> value;
        *pHead = tempNode -> next;
        free(tempNode);
        STACK_ELEMENTS--;
    }
    else
        return 0;
    return val;

}

int main(int argc, char *argv[]) {
    /*verify arguments*/
    if (argc != 3) {
        fprintf(stderr, "usage: strrev <file> <newfile>\n");
        exit(1);
    }

    char *fileIn = argv[1];
    char *fileOut = argv[2];

    /*open file streams*/    
    FILE *in = fopen(fileIn, "r");
    FILE *out = fopen(fileOut, "w");


    /*scan input file and delimt on semicolon*/
    /*input file is a single line of semicolon-delimited values*/
    char str1[128];
    while(!feof(in))
    {
        /*scan, delimiting on semicolon*/
        /*if the scanned element does not fit format, break*/
        if (fscanf(in, "%[^;];", str1) != 1) {
            break;
        }
        push((values -> head), str1);
    }

    while(!stack_isEmpty()) {
        fprintf(out,"%s;", pop(&(values -> head)));
    }

    fclose(in);
    fclose(out);
    return 0;
}

最佳答案

Stack *values;

这个“值”似乎没有初始化。

你需要的是:

Stack *values = malloc(sizeof(Stack ));

关于C: Segmentation Fault -- 堆栈实现链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21753669/

相关文章:

c++ - 为什么将项目添加到链表会导致段错误?

c - PIC16F877A液晶显示屏

c - 在 C 语言中使用命名管道

c - 在 Code::Blocks 中开发 C?

c - 如何在C中将客户端请求的数据时间和数据大小发送给客户端?

c - 从文件读取最后 n 个字节时出现段错误

c++ - C++中的指针与汇编语言中的指针之间的区别?

c++ - 使用 C++ 从另一个类访问一个类中的数组

algorithm - 链表在恒定时间内跟踪最小值?

c++ - 从链表中删除节点无法正常工作