2013-08-29 51 views
0

我想通過將指針傳遞給另一個函數並通過指針修改它來修改靜態結構對象。 但即使執行修改函數後,結構的值也是完整的。傳遞指向靜態結構對象的指針

void some_functon_a(....) 
{ 
    static struct some_struct obj; 
    modifier_function_b(&obj); 
    // obj is not modified as expected in fact not at all 
} 

void modifier_function_b(struct some_struct *ptr) 
{ 
    // modifying the struct using ptr 
} 

此外,當我對這個代碼運行GDB,我儘快看到的碼流進入modifier_function_b()函數GDB報告變量PTR兩個條目:PTR和PTR @條目。所有的修改都是在ptr上完成的,而指向obj的實際位置的ptr @ entry沒有被修改。有人能指出可能發生的事情嗎?是指向靜態變量類型的const指針,我們不能修改它們超出其範圍?

還有一件事...如果我刪除靜態限定符,這導致我認爲指向靜態的指針是一種常量指針,則不會看到此行爲。提前:)

+0

究竟是modifier_function-b中的代碼?編譯完成後,Const'ness會丟失,所以沒有「不,不要讓它改變」。 – xaxxon

+0

我猜你的修改代碼是錯誤的,因爲我剛剛寫了一些與你的描述相對應的東西,並沒有出現這個問題。請參閱下面的答案。 – xaxxon

+0

另外,你爲什麼期待改變的指針? – xaxxon

回答

0

由於工程按預期該程序。它打印出1 2,然後5 6.此外,您沒有指定語言,但是這在C和C++中都是預期的。

#include <stdio.h> 

struct bar { 
    int i; 
    int j; 
}; 

void b(struct bar * foo) { 
    foo->i = 5; 
    foo->j = 6; 
} 

void aa(){ 
    static struct bar a; 
    a.i = 1; 
    a.j=2; 
    printf("%d %d\n", a.i, a.j); 
    b(&a); 
    printf("%d %d\n", a.i, a.j); 
} 


int main(){ 
    aa(); 

} 
+0

感謝您的快速回復。 這當然不是實際的代碼......這只是我認爲與問題相關的部分。現在,如果我運行代碼並且不使用gdb調試,我會發現代碼的行爲與使用printk語句時的預期相同,但是當我嘗試使用gdb進行調試時,它的行爲與原始問題中提到的相同。 這是否意味着我不應該總是相信調試器? –

+0

@NaveenRawat printk?你在編寫內核代碼嗎? – xaxxon

+0

是的......在這種情況下會有什麼影響嗎? –