字符串堆栈的C问题

字符串堆栈的C问题,c,stack,C,Stack,所以我试图用C语言创建一个字符串堆栈,我似乎遇到了一个问题。目标是读取一个文件,然后反向打印。我认为堆栈是实现这一点的最合适的方法(我知道有更简单的方法,但我想用结构来挑战自己) 这是我的推送/打印堆栈代码: void push(struct LineStack * stack, char * line) { if(!stack->head) { stack->head = malloc(sizeof(struct entry *));

所以我试图用C语言创建一个字符串堆栈,我似乎遇到了一个问题。目标是读取一个文件,然后反向打印。我认为堆栈是实现这一点的最合适的方法(我知道有更简单的方法,但我想用结构来挑战自己)

这是我的推送/打印堆栈代码:

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;
}
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?
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;
}
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来查看问题所在,而且推送调用似乎工作正常。每个调用将不同的行放在不同的内存位置,因此我必须假设组成堆栈的链表运行良好。我是不是错过了一些愚蠢的小事

以下是条目/行堆栈声明供参考:

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()
将是制作字符串副本的常规方法。不管是哪种方式,请记住,在允许最后一个指向它的指针丢失之前,您有责任在处理完动态分配的内存后释放它。

您的
main()
将每一行读取到本地数组
行中。然后它将(指向该数组的指针)传递给函数
push()
。该函数只是将该指针存储在堆栈中——不复制数据,只复制指针。因此,所有堆栈项都包含指向同一数组的指针;当您打印它们时,此数组包含从文件中读取的最后一行,这就是您打印的内容,与您读取行的次数相同


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

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

stack->head = malloc(sizeof(struct entry *));
这里,您分配的内存块大小与指向
struct entry
的指针相同,而不是
struct entry
本身的大小。应该是:

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

当您为
堆栈->条目分配内存时,同样的问题也会发生。除了@JohnBollinger已经说过的以外,您还有以下问题:

stack->head = malloc(sizeof(struct entry *));
这里,您分配的内存块大小与指向
struct entry
的指针相同,而不是
struct entry
本身的大小。应该是:

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

当为
stack->entry

分配内存时,同样的问题也会发生。
newStack()
?newStack()和大小没有定义。您应该避免
push()
函数中的大多数(如果不是所有的话)特殊情况下的代码重复。
printStack()
函数会损坏(销毁)堆栈。您需要创建一个本地指针并逐步遍历堆栈,而不是在每次迭代中更改
堆栈->头
。哪里是
newStack()
函数会损坏(破坏)堆栈。您需要创建一个本地指针并在堆栈中单步执行,而不是在每次迭代中更改
堆栈->头部。