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
分配内存时会发生同样的问题。