2016-07-27 133 views
2

第一次發佈在這裏,任何幫助,將不勝感激。我試圖通過稱爲Stack_Init的函數來改變我的棧內名爲「try」的值「size」。如果我在函數中打印出「堆棧 - >大小」的值,它會給出正確的大小值(4)。如果我是執行我的函數(在代碼的結束)後打印 try->size,它會給我的0.1如何通過函數更改結構中數據的值?

struct intnode { 
    int data; 
    struct intnode *next; 
}; typedef struct intnode node; 

struct stack { 
    node *top;  
    int size; 
}; typedef struct stack Stack; 

void Stack_Init(Stack *S, int size){ 
    Stack *stack = malloc(size*sizeof(node)); 
    stack->top = NULL; 
    stack->size = size;//for some reason, this doesn't change try->size 
} 
int main(){ 
    Stack *try; 
    int size = 4; 
    Stack_Init(try,size); 
    printf("%d %d ", try->size, try->top); 

謝謝值的閱讀!

+0

'Stack * stack = malloc(size * sizeof(node));'。這是一個局部變量。它與'main'中的'try'沒有關係。你爲什麼會這樣想?大多數初學者犯了'S = stack'的錯誤。這也是錯誤的,因爲'S'是函數的局部。但是你甚至沒有這樣做,所以不知道你如何期望'stack'會回到'main'。 – kaylum

+0

我之前將它作爲'S'而不是堆棧,但它並沒有改變主體中的任何東西。現在看看它沒有任何意義,我如何聯繫嘗試函數? –

回答

3

您正在嘗試更改傳遞給該函數的指針,因此您需要額外的間接級別,即指向指針的指針。此外,你需要分配到復引用參數,而不是一個局部變量:

void Stack_Init(Stack **S, int size){ 
    //    ^
    //     | 
    //  Extra asterisk here 
    *S = malloc(size*sizeof(node)); 
//^
// | 
// Dereference the pointer passed into the function 
    (*S)->top = NULL; 
    (*S)->size = size; 
} 

給函數的調用需要看起來像這樣:

Stack_Init(&try,size); 
//  ^
//   | 
// Pass a pointer to a pointer 
+0

「您正嘗試更改傳遞給函數的指針」。 Nit挑選。 OP甚至沒有這樣做。 – kaylum

+0

非常感謝你的幫助,非常感謝! –

+0

您不需要更改功能簽名。 'Stack ** S'意味着你有一個'Stack *'列表。此外,你正在使用'&try'參數來將'Stack *'變成'Stack **'。這只是讓事情複雜化。 – kamoroso94

0

Stack_Init功能具有與其幾個問題。您正在修改局部變量而不是傳遞給該函數的參數,並且您錯誤地分配了內存。試試這個。

void Stack_Init(Stack **S,int size) { 
    Stack *stack = (Stack*)malloc(sizeof(Stack)); 
    stack->top = NULL; 
    stack->size = size; 
    *S = stack; 
} 
+0

感謝您的關注。你說得很對。 – kamoroso94

+0

非常真實。我修改了這個函數以反映這個問題,並使它更接近問題中的代碼。 – kamoroso94