在pop()函数中,我试图更改Last全局变量的值。它在push(n)函数中运行良好,而在pop()函数中,它在函数内部对其进行了更改(通过打印进行验证),但是在退出方法后立即将其重置为先前的值。无法绕开它。
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
int *Stack;
int Last = -1;
void make_empty( void ){
free(Stack);
Last = -1;
Stack = NULL;
//Stack = malloc(4);
return;
}
int is_empty( void ){
if (Last == -1)
return 1;
return 0;
}
int top( void ){
if (is_empty()) {
printf("La pila è vuota");
}
return Stack[Last];
}
int pop( void ){
if (is_empty()) {
printf("La pila è vuota");
return 0;
}
int temp = Stack[Last];
printf("last: %d\n", Last);
Stack = realloc(Stack, --Last*sizeof(int));
printf("last: %d\n", Last);
return temp;
}
void push( int n ){
Stack = realloc(Stack, ++Last*sizeof(int));
Stack[Last] = n;
return;
}
void print_stack( void ){
printf("last: %d\n", Last);
for (int c=0; c<=Last; c++)
printf("%d ", Stack[c]);
printf("\n");
}
您没有为堆栈分配足够的空间。
[开始时Last
为-1。然后将元素压入堆栈并分配空间:
Stack = realloc(Stack, ++Last*sizeof(int));
增量后,Last
为0。因此,您正在分配0*sizeof(int) == 0
字节。然后,您写入不存在的Stack[Last]
。这会调用undefined behavior,在您的情况下,它会通过使变量在您不期望的时候发生更改而体现出来。
由于Last
包含最后一个有效索引,因此您想向其添加1以获取要分配的适当元素数:
Stack = realloc(Stack, (++Last + 1)*sizeof(int));
弹出时您犯了类似的错误:
Stack = realloc(Stack, --Last*sizeof(int));
您还需要在此处添加1:
Stack = realloc(Stack, (--Last + 1)*sizeof(int));
堆栈的实现包含未定义的行为。