[英]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.