簡體   English   中英

C,全局變量更改不會保留在 function 之外

[英]C, Global Variable change isn't kept outside the function

在 pop() function 中,我試圖更改 Last 全局變量的值。 它在 push(n) function 中工作正常,而在 pop() 中,它在 function 內更改它(通過打印驗證它),但在離開方法后它會重置為以前的值。 我無法理解它。

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

堆棧的實現包含未定義的行為。

例如最初Last等於-1

int Last = -1;

然后在push操作中

void push( int n ){
    Stack = realloc(Stack, ++Last*sizeof(int));
    Stack[Last] = n;
    return;
}

由於++Last等於0 ,因此分配了大小等於0的 memory 。 您不能更改分配的大小等於0的 memory 。

方法pop也存在類似的問題。 Last等於0時,則在此語句中

Stack = realloc(Stack, --Last*sizeof(int));

由於操作數sizeof(int)的類型,表達式--Last等於-1轉換為size_t類型的最大值。

例如,您可以通過以下方式編寫方法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 語句

if ( Last == 0 ) 
{
    free( Stack );
    Stack = NULL;
}

當堆棧為空時,所有分配的 memory 必須被釋放並且Stack必須設置為NULL

您沒有為堆棧分配足夠的空間。

開始時Last是 -1。 然后你將一個元素壓入堆棧並分配空間:

Stack = realloc(Stack, ++Last*sizeof(int));

增量后, Last為 0。因此您分配0*sizeof(int) == 0個字節。 然后您寫入不存在的Stack[Last] 這會調用未定義的行為,在您的情況下,這會在您不期望時通過導致變量發生變化來表現出來。

由於Last包含最后一個有效索引,因此您希望向其添加 1 以獲得要分配的正確數量的元素:

Stack = realloc(Stack, (++Last + 1)*sizeof(int));

彈出時您會犯類似的錯誤:

Stack = realloc(Stack, --Last*sizeof(int));

您還需要在此處添加 1:

Stack = realloc(Stack, (--Last + 1)*sizeof(int));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM