2012-05-24 3 views
1

글로벌 포인터를 가리키는 로컬 포인터를 사용하고 싶습니다. 포인터는 로컬 포인터이고 문자열은 전역입니다. 이 코드를 실행하여 로컬 포인터를 함수 "myfun"에 전달하면 포인터가 변경되지 않습니다. 즉, 포인팅 주소가 변경되지 않습니다. 인쇄 된 값은 "NULL"입니다.글로벌 함수에 대한 로컬 포인터

누군가 gcc에서 이것이 작동하지 않는 이유를 말해 줄 수 있습니까?

#include <stdio.h> 

char *str[] = { "String #1", "Another string" }; 

void myfun(void * p, int i) 
{ 
    p = (void *) &str[ i ][ 0 ]; 
} 

int main(void) 
{ 
    void * ptr1, * ptr2; 

    myfun(ptr1, 0); 
    myfun(ptr2, 1); 
    printf("%s\n%s\n", ptr1, ptr2); 
} 
+0

당신은 우리에게 * 어떻게 * 작동하지 않는지 말함으로써 시작합니다. 당신은 무엇을 기대 했습니까? 실제로 무슨 일이 있었습니까? – abelenky

+0

향후 독자의 혜택을 누리시면, "편집 할 수 없다"라는 내용의 설명을 포함하도록이 책을 편집하면 좋을 것입니다. 컴파일되지 않습니까? 충돌? 실행하지만 예상 한 동작을 나타내지 않습니다? – razlebe

+0

나는 그것을 편집했다. – Marsil

답변

5

포인터를 값으로 myfun에 전달하고 있습니다. 따라서 pmyfun에 할당 한 값은 발신자에게 반환되지 않습니다.

는 사실
myfun(&ptr1, 0); 

이 같은 myfun 쓸 수 있습니다 :

void myfun(void ** p, int i) 
{ 
    *p = (void *) &str[ i ][ 0 ]; 
} 

그리고 다음과 같이 호출 : 당신은 포인터에 대한 포인터를 전달해야

void myfun(void ** p, int i) 
{ 
    *p = str[i]; 
} 

그리고 실제로 그것을 함수의 반환 값으로 void*을 반환하는 것이 가장 간단 할 것입니다 :

기본적으로
+0

좋습니다. 답변을 수락하는 것이 좋습니다. http://meta.stackexchange.com/questions/5234/ –

+0

David Heffernan. 감사합니다. Boths 솔루션은 정상적으로 작동했습니다. 그러나 이것은 단지 예일뿐입니다. 실제로 하나 이상의 포인터로이 작업을 수행해야하며 반환은 작동하지 않으므로 포인터를 입력 argumenst로 전달해야합니다. 다시 감사합니다. – Marsil

0

, 당신의 질문에서 어떤 차이가 없다 - 당신의 코드에서

void func(int i) 
{ 
    i = 2; 
} 

int main() 
{ 
    int i = 0; 
    printf("i = %d\n", i); 
    func(i); 
    printf("i = %d\n", i); /* Wonder why it doesn't output i = 2? */ 
} 

, 당신은 값으로 ptr1 (및 ptr2) 인수를 전달, 귀하가받는 매개 변수 p의 값을 변경하고 기대 이 변경 사항은 귀하가 통과 한 인수에 반영됩니다. 즉, ptr1ptr2은 여전히 ​​값으로 전달한다는 사실을 변경하지 않습니다.

또한 IANAL (내가 잘못하면 언어 변호사가 문제를 해결하기를 바랍니다.)하지만 printf에 대한 인자로 void 변수에 대한 포인터를 보내면 잠재적으로 문제가 있다고 생각합니다.

관련 문제