C,全局变量更改不保留在函数之外

时间:2019-11-21 14:01:04

标签: c struct stack malloc global-variables

在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");
}

2 个答案:

答案 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));