C,全局变量更改未保留在函数外部

问题描述 投票:-1回答:2

在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");
}
c stack malloc global-variables
2个回答
0
投票

您没有为堆栈分配足够的空间。

[开始时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));

0
投票

堆栈的实现包含未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.