所以我试图在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;
};
提前致谢。
答案 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
分配内存时会出现同样的问题。