2016-08-03 3 views
1

왜이 코드가 컴파일에 성공합니까?이 코드가 "20"을 인쇄하지 않는 이유는 무엇입니까?

설명 : 이클립스에서 컴파일되었습니다. 줄에있는 문제를 봅니다 : x = (int *) malloc (sizeof (int));

왜이 프로그램이 런타임에 중단되지 않았습니까?

+6

C는 너에게 걸리는 데 충분한 로프를 제공하기 때문에. – Idos

+1

삭제'x = (int *) malloc (sizeof (int));'% d \ n "' – BLUEPIXY

+1

malloc의 결과를 C로 변환하지 않고 sizeof (* x) 대신 sizeof (int)를 사용하십시오. – Caw

답변

6

구문 적으로 코드에 아무런 문제가 없으므로 컴파일됩니다.

y의 주소가 함수에 전달됩니다. y의 주소를 보유하는 함수의 포인터 x은 malloc에 ​​의해 할당 된 유효한 메모리의 주소로 대체됩니다. 포인터의 값이 변경되면서 int가 거기에 쓰여지고 y에 기록되지 않습니다. 그런 다음 함수가 반환됩니다 (fun의 할당 된 메모리는 '누출'을합니다).

메인에있는 y의 값은 변경되지 않습니다.

이 프로그램의 동작이 정의됩니다.

+0

@ user3781974 질문에 몇 가지 오타가 있습니다. 문제를 해결하십시오. – 2501

3

안녕하세요, 스택에 푸시 된 변수 y의 주소 사본을 전달 중입니다. 당신은 malloc에 의해 반환 된 주소를 할당하여 (포인터가 추진 된 위치에서) 포인터를 조작하고 main 예에서 변수에 영향을주지 않는

*x = 20 

하여 해당 주소로 (20)의 값을 복사 y

당신이

void fun(int** x){ 
    *x=(int*)malloc(sizeof(int)); 
    **x = 20; 
} 

int main(){ 
    int *y; 
    fun(&y); 
    printf("%d",*y); 
} 
+2

'main'에서'y'와'y' remans _uninitialized_의 복사본에 메모리가 할당되어 있기 때문에 여러분이 준 예제는 잘못되었습니다. 기본적으로 ** _ 정의되지 않은 동작 _ **이 있습니다. – ameyCU

+0

@ameyCU 감사합니다. –

+0

왜 이중 간접 사용 하시겠습니까? 왜 'void fun (int * x) {* x = 20; }'그리고 그냥'int y; 재미 (&y);'기본? –

1
x=(int*)malloc(sizeof(int)); //x point to a new addr. 

*x = 20; // change value of new pointer 

도움이 라인을 삭제할 수는 20를 인쇄하려면 x=(int*)malloc(sizeof(int));이면 작동 할 것입니다.

0

main 함수에서 변수 y의 주소를 변경한다고 가정합니다. y의 주소 값을 함수에 전달하여이를 수행 할 수는 없습니다. 주소가 y 인 할당 작업이 없기 때문입니다. 귀하의 예제에서는 주소가 y (할당하는 것을 잊어 버림)에 대한 변수 (기본적으로 포인터)가 없습니다.

int* fun(int* x){ 
     printf("Fun before %p - %d\n", x, *x); 
     x = malloc(sizeof(int)); 
     *x = 20; 
     printf("Fun after %p - %d\n", x, *x); 
     return x; // return your new address 
    } 

    int main(){ 
     int *y = malloc(sizeof(int)); 
     *y = 31; 
     printf("Main before %p - %d\n", y, *y); 
     y = fun(y); // assign your new address here 
     printf("Main after %p - %d\n", y, *y); 
     return 0; 
    } 

위 코드가 수행합니다.

관련 문제