堆栈字符串的C问题

时间:2017-01-31 18:50:15

标签: c stack

所以我试图在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("%s\n", 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;
};

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

除了@JohnBollinger所说的,你还有以下问题:

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

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

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

stack->entry分配内存时会出现同样的问题。