我正在嘗試自己實作(以便更好地理解它)C 語言中的 Stack 資料結構。
這是我到目前為止所得到的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stack{
//Data_Strucure: Stack of intgers
int *stack;
int size_of_stack;
int elem_in_stack;
};
struct stack *creat_stack(unsigned int);
int push(struct stack *, int);
int pop(struct stack *);
int empty(struct stack *);
int peek(struct stack *);
int main(int argc, char *argv[]){
int new_elem = 13;
struct stack *new_stack = creat_stack(5);
printf("%d %d\n", new_stack->size_of_stack, new_stack->elem_in_stack);
//Crashes from here
push(new_stack, new_elem);
printf("%d\n", new_stack->stack[new_stack->size_of_stack]);
}
struct stack *creat_stack(unsigned int size){
struct stack tmp;
struct stack *ret_stack = &tmp;
if((ret_stack->stack = malloc(sizeof(int) * size)) == NULL){
fprintf(stderr, "Unable to allocate memory for the Stack.\n");
exit(1);
}
ret_stack->size_of_stack = size;
ret_stack->elem_in_stack = 0;
return ret_stack;
}
int push(struct stack *stack, int nw_elem){
int pos = stack->size_of_stack - stack->elem_in_stack;
if(stack->size_of_stack == 0)
return 1;
stack->stack[pos] = nw_elem;
}
編譯器沒有回傳錯誤。雖然我不明白為什么它在push()被呼叫后崩潰。請,如果可能,而不是解決方案代碼,你能告訴我錯誤在哪里嗎?這樣我就可以理解它如何影響整個程式并嘗試自己解決它(這樣下次就不會再發生了)。感謝您提供任何有用的答案。
uj5u.com熱心網友回復:
至少功能creat_stack不正確。
struct stack *creat_stack(unsigned int size){
struct stack tmp;
struct stack *ret_stack = &tmp;
//...
return ret_stack;
}
它回傳一個指向本地物件的指標,該物件tmp在退出函式后將不再存在。所以回傳的指標將是無效的,并且取消參考這樣的指標會呼叫未定義的行為。
相反,您可以從函式中回傳物件本身。那就是函式宣告可能看起來像
struct stack creat_stack(unsigned int size);
主要是你可以寫
struct stack new_stack = creat_stack(5);
此外,該函式push不會更改資料成員elem_in_stack并且它再次呼叫未定義的行為,因為當elem_in_stack等于 0 時,該函式會嘗試寫入動態分配的陣列之外的記憶體。即在這種情況下pos等于size_of_stack。
int push(struct stack *stack, int nw_elem){
int pos = stack->size_of_stack - stack->elem_in_stack;
if(stack->size_of_stack == 0)
return 1;
stack->stack[pos] = nw_elem;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464183.html
下一篇:將陣列回傳到C中的函式的問題
