2013-08-29 2 views
0

정적 구조체 객체를 수정하려면 포인터를 다른 함수에 전달하고 그 포인터를 포인터로 수정하십시오. 그러나 수정 기능을 실행 한 후에도 구조체의 값은 손상되지 않습니다. PTR 및 PTR @ 항목 :이 코드에서 GDB를 실행하면 코드의 흐름이 modifier_function_b() 함수 GDB가 변수 PTR에 대한 두 개의 항목을보고 들어가는포인터를 정적 구조체 객체에 전달합니다.

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 
} 

또한, 나는 즉시 참조하십시오. obt의 실제 위치를 가리키는 ptr @ entry는 수정되지 않은 반면 모든 수정은 ptr에서 수행됩니다. 누군가 여기서 일어날 수있는 일을 지적 할 수 있습니까? 정적 변수에 대한 포인터가 const 포인터와 같습니까? 범위 밖에서 포인터를 수정할 수 없습니까?

한 가지 더 ... 정적 인 포인터를 정적 포인터라고 생각하게하는 정적 한정자를 제거하면이 동작이 보이지 않습니다.

미리 감사드립니다. :)

+0

정확하게 modifier_function-b에있는 코드는 무엇입니까? Const'ness는 편집이 끝나면 없어 지므로, "아니오, 계속 변경하지 마라"라는 말은 없습니다. – xaxxon

+0

방금 ​​귀하의 설명에 해당하는 내용을 작성 했으므로 수정 코드가 잘못되었다고 추측합니다.이 문제는 발생하지 않습니다. 아래 내 대답을 참조하십시오. – xaxxon

+0

또한 포인터가 바뀌기를 기대하는 이유는 무엇입니까? – xaxxon

답변

0

이 프로그램은 예상대로 작동합니다. 또한 언어를 지정하지 않았지만 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

예 ...이 경우에 어떤 영향이 있습니까? –

관련 문제