2014-09-15 1 views
0

두 개의 다른 기능을 사용하여 변수를 업데이트하려고합니다. 나는 약간의 C 프로그램을 작성하여 설명했다 :값이 C에서 둘 이상의 함수를 통과 할 때 변수를 업데이트하려면 어떻게해야합니까?

#include <stdlib.h> 
#include <stdio.h> 

void updateHelper(int *x, int y) { 
    *x = y; 
} 

void update(int x, int y) { 
    updateHelper(&x, y); 
} 

int main(int argc, char *argv[]) { 

    int num = 0; 
    update(num, 1); 
    printf("%d\n", num); 

    return 0; 
} 

왜이 인쇄가 0이 아닌 1입니까? 나는 이것에 대해 내 머리를 감쌀 수 없다. 실제로 값을 업데이트하는 함수는 참으로 변수 (!?)의 참조를 전달합니다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까?

update()의 인수는 포인터가 될 수 없습니다. 이에 대한 가능한 해결 방법이 있습니까?

+2

''update'의 리턴 타입을 바꿀 권한이 있습니까? – fvu

+0

아니요. 실제 문제는 데이터 구조를 업데이트하려고하는 중입니다. 그리고 인터페이스는이 예에서 void update (int, int)로 함수를 선언합니다. 정말 이렇게 할 방법이 없습니까? – lsund

+0

흠, 단순화/난독 화로 인해 문제를 이해하기 어렵거나 유효한 대안을 제시하는 것이 어려워 졌다고 생각합니다. – fvu

답변

3

원래 변수를 업데이트하지 않습니다. update 함수에 전달 된 해당 변수의 복사본을 업데이트 중입니다. 원래 변수를 업데이트 할 경우, 포인터 등의 매개 변수입니다 취할 update을 변경

update(&num, 1); 

편집 :

void update(int* x, int y) { 
    updateHelper(x, y); 
} 

메인에, 주소를 통과 업데이트하기 위해 인수를 언급 한 이후 포인터가 될 수 없다면 update이 새로운 변수를 반환하거나 전역 변수를 사용하거나 또는 ... C에서 함수의 변수에 대한 참조를 수정하는 유일한 방법은 포인터를 사용하는 것입니다.

+0

고맙습니다. 당신은 모든 것을 분명하게했습니다. 나는 재 설계 할 물건이 있다고 생각한다. – lsund

+0

걱정할 필요가 없습니다. 행운을 빌어 요. – bstamour

0

xupdate으로 호출하는 경우 mainnum과 동일한 값으로 시작하는 로컬 변수 일뿐입니다. 따라서 값이 updateHelper 호출을 통해 변경 되더라도이 값은 num 값에 영향을 미치지 않습니다. 즉, 주소가 아닌 num의 값만이 update으로 전달되었으므로 update을 호출하는 동안 이후에 아무 것도 발생하지 않으므로 num 값과 관련이 없습니다.

0
update(int x,..) 

여기서 x는 값에 의한 인수입니다. 즉 num의 복사 (생성 된 새 주소)가 생성되고 값이 복사됩니다.

대신 시도해보십시오 update 기능

#include <stdlib.h> 
#include <stdio.h> 

void updateHelper(int *x, int y) { 
    *x = y; 
} 

void update(int *x, int y) { 
    updateHelper(x, y); 
} 

int main(int argc, char *argv[]) { 

    int num = 0; 
    update(&num, 1); 
    printf("%d\n", num); 

    return 0; 
} 
+0

OP는 'update()의 인수가 포인터가 될 수 없다'라고 명시 적으로 말했습니다. – fvu

0

귀하의 초기 호출 int num이 아니라 복사 참조됩니다 것을 의미 정상적인 통화 별 값입니다. 따라서 나중에 updateHelper을 매개 변수 x에 대한 참조로 호출하면 수정 된 값은 update 함수의 로컬 인 num 값의 복사 된 값입니다.

그래서, 당신의 호출 스택은 다음과 같이 찾고 끝 (맨 바닥에서 읽기) : 당신의 update 기능의 인터페이스 포인터를 취할 수없는 경우

main() 
|    num: 0 
| 
update()     < But `update's` x is a copy, does not point to anything 
|    x: 1 . 
|      \ 
updateHelper()   | < Points to `update's` x 
|     /
|    *x: 1^

, 다음이 가지고있는 유일한 옵션이다 수정 된 값을 반환하거나 (인터페이스에도 변경이 필요함) 전역 변수를 사용할 수도 있습니다.

관련 문제