字符串堆栈的C问题
所以我试图用C语言创建一个字符串堆栈,我似乎遇到了一个问题。目标是读取一个文件,然后反向打印。我认为堆栈是实现这一点的最合适的方法(我知道有更简单的方法,但我想用结构来挑战自己) 这是我的推送/打印堆栈代码:字符串堆栈的C问题,c,stack,C,Stack,所以我试图用C语言创建一个字符串堆栈,我似乎遇到了一个问题。目标是读取一个文件,然后反向打印。我认为堆栈是实现这一点的最合适的方法(我知道有更简单的方法,但我想用结构来挑战自己) 这是我的推送/打印堆栈代码: void push(struct LineStack * stack, char * line) { if(!stack->head) { stack->head = malloc(sizeof(struct entry *));
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()
函数会损坏(破坏)堆栈。您需要创建一个本地指针并在堆栈中单步执行,而不是在每次迭代中更改堆栈->头部。