在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+1)*sizeof(int));
printf("last: %d\n", Last);
return temp;
}
void push( int n ){
Stack = realloc(Stack, (++Last+1)*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");
}
答案 0 :(得分:0)
堆栈的实现包含未定义的行为。
例如,最初Last
等于-1
。
int Last = -1;
然后在push
操作中
void push( int n ){
Stack = realloc(Stack, ++Last*sizeof(int));
Stack[Last] = n;
return;
}
因为0
等于++Last
,所以分配了大小等于0
的内存。您不得更改分配的大小等于0
的内存。
方法pop
存在类似的问题。当Last
等于0
时,在此语句中
Stack = realloc(Stack, --Last*sizeof(int));
表达式--Last
等于-1
,由于操作数size_t
的类型,表达式sizeof(int)
转换为类型push
的最大值。
例如,您可以通过以下方式编写方法void push( int n ){
Stack = realloc(Stack, ( ++Last + 1 ) *sizeof(int));
Stack[Last] = n;
return;
}
pop
在if ( Last == 0 )
{
free( Stack );
Stack = NULL;
}
else
{
Stack = realloc(Stack, ( Last *sizeof(int));
}
--Last;
方法中,您可以使用
if ( Last == 0 )
{
free( Stack );
Stack = NULL;
}
请注意此if语句
Stack
当堆栈为空时,必须释放所有分配的内存,并且必须将NULL
设置为document.getElementsByClassName("whatever")
。
答案 1 :(得分:0)
您没有为堆栈分配足够的空间。
Last
首先是-1。然后将元素压入堆栈并分配空间:
Stack = realloc(Stack, ++Last*sizeof(int));
增量后,Last
为0。因此,您正在分配0*sizeof(int) == 0
个字节。然后,您写入不存在的Stack[Last]
。这会调用undefined behavior,在您的情况下,https://jsfiddle.net/La8wQ/10/会导致变量在您不期望的时候发生更改。
由于Last
包含最后一个有效索引,因此您想向其添加1以获取要分配的适当元素数:
Stack = realloc(Stack, (++Last + 1)*sizeof(int));
弹出时,您也会犯类似的错误:
Stack = realloc(Stack, --Last*sizeof(int));
您还需要在此处添加1:
Stack = realloc(Stack, (--Last + 1)*sizeof(int));