C堆栈字符串的问题

所以我试图在C中创建一个字符串堆栈,我似乎遇到了一个问题。 目标是读取文件,并将其反向打印。 我决定一个堆栈是最合适的方式来做到这一点(我意识到有更简单的方法来做到这一点,但我想用自己的结构来挑战自己)。

这是我的push / printStack代码:

void push(struct LineStack * stack, char * line)
{
    if(!stack->head)
    {
        stack->head = malloc(sizeof(struct entry *));
        stack->head->data = line;
        stack->head->next = NULL;
        stack->top = stack->head->data;
        stack->size++;
    }
    else
    {
        struct entry * entry = malloc(sizeof(struct entry *));
        entry->data = line;
        entry->next = stack->head;
        stack->head = entry;
        stack->top = stack->head->data;
        stack->size++;
    }
 }                                                                                                                

void printStack(struct LineStack * stack)
{
    while(stack->head)
    {
        printf("%sn", stack->head->data);
        stack->head = stack->head->next;
    }
} 

这里是main / tempFile.txt:

int main(void)
{
    struct LineStack * stack = newStack();
    char * fileName = "tempFile.txt"
    char line[SIZE];

    FILE * fp = fopen(fileName, "r");

    while(fgets(line, 128, fp) != NULL)
        push(stack, line);

    printStack(stack);

    free(stack);

    return 0;
}

tempFile.txt:

Lets begin
We'll say 2 + 2 = 4
But then go ahead and prove that 1 + 2 + 3 + 4 + ... = -1/12
How can this be?
How can this be?

当我尝试运行代码时,它会在文件(5)中打印出正确数量的行,但只打印出“这怎么可能”。 现在,我尝试使用GDB来查看问题所在,并且推送电话似乎正常工作。 每次调用将不同的行放在不同的内存位置,因此我必须假设构成堆栈的链接列表正常运行。 我错过了一些愚蠢和小事吗?

作为参考,这里是入口/ LineStack声明:

struct entry
{
    char * data;
    struct entry * next;
};

struct LineStack
{
    struct entry * head;
    char * top;
    int size;
};

提前致谢。


你的main()将每行读入本地数组line 。 然后它传递(一个指向)这个数组的函数push() 。 该函数只是将此指针存储在堆栈中 - 数据不会被复制,只是指针。 结果,所有的堆栈条目都包含指向同一个数组的指针; 当你打印它们时,这个数组包含从文件中读取的最后一行,这就是你打印的内容,与读取行的次数一样多。

您需要复制输入字符串。 如果你有strdup() (一个POSIX函数,但不是标准的C函数),那么这就是制作这样一个副本的最简单方法。 否则,[ strlen() +] malloc() + strcpy()将是制作字符串副本的传统方式。 无论哪种方式,请记住,当你完成这些动态分配的内存时,你需要负责释放每一块动态分配的内存,然后才允许丢失最后一个指针。


除了@JohnBollinger已经说过的,你有以下问题:

stack->head = malloc(sizeof(struct entry *));

在这里,你将一块内存分配给指向struct entry的指针大小,而不是struct entry本身的大小。 它应该是:

stack->head = malloc(sizeof(struct entry));

当为stack->entry分配内存时会发生同样的问题。

链接地址: http://www.djcxy.com/p/84349.html

上一篇: C Issues with Stack of Strings

下一篇: Infix to Postfix conversion error