왜이 코드가 컴파일에 성공합니까?이 코드가 "20"을 인쇄하지 않는 이유는 무엇입니까?
설명 : 이클립스에서 컴파일되었습니다. 줄에있는 문제를 봅니다 : x = (int *) malloc (sizeof (int));
왜이 프로그램이 런타임에 중단되지 않았습니까?
왜이 코드가 컴파일에 성공합니까?이 코드가 "20"을 인쇄하지 않는 이유는 무엇입니까?
설명 : 이클립스에서 컴파일되었습니다. 줄에있는 문제를 봅니다 : x = (int *) malloc (sizeof (int));
왜이 프로그램이 런타임에 중단되지 않았습니까?
구문 적으로 코드에 아무런 문제가 없으므로 컴파일됩니다.
y
의 주소가 함수에 전달됩니다. y
의 주소를 보유하는 함수의 포인터 x
은 malloc에 의해 할당 된 유효한 메모리의 주소로 대체됩니다. 포인터의 값이 변경되면서 int가 거기에 쓰여지고 y
에 기록되지 않습니다. 그런 다음 함수가 반환됩니다 (fun
의 할당 된 메모리는 '누출'을합니다).
메인에있는 y
의 값은 변경되지 않습니다.
이 프로그램의 동작이 정의됩니다.
@ user3781974 질문에 몇 가지 오타가 있습니다. 문제를 해결하십시오. – 2501
안녕하세요, 스택에 푸시 된 변수 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);
}
'main'에서'y'와'y' remans _uninitialized_의 복사본에 메모리가 할당되어 있기 때문에 여러분이 준 예제는 잘못되었습니다. 기본적으로 ** _ 정의되지 않은 동작 _ **이 있습니다. – ameyCU
@ameyCU 감사합니다. –
왜 이중 간접 사용 하시겠습니까? 왜 'void fun (int * x) {* x = 20; }'그리고 그냥'int y; 재미 (&y);'기본? –
x=(int*)malloc(sizeof(int)); //x point to a new addr.
*x = 20; // change value of new pointer
도움이 라인을 삭제할 수는 20를 인쇄하려면 x=(int*)malloc(sizeof(int));
이면 작동 할 것입니다.
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;
}
위 코드가 수행합니다.
C는 너에게 걸리는 데 충분한 로프를 제공하기 때문에. – Idos
삭제'x = (int *) malloc (sizeof (int));'% d \ n "' – BLUEPIXY
malloc의 결과를 C로 변환하지 않고 sizeof (* x) 대신 sizeof (int)를 사용하십시오. – Caw