vhxpffltm12   6년 전

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<queue>
#include<stack>
#include<functional>

using namespace std;

void alloc(int *x, int n) {
         x = (int *)malloc(sizeof(int)*n);
}

int main()
{
         int *a;
         alloc(a, 100);
         a[50] = 1;
         printf("%d ", a[50]);
         return 0;
}


해당 코드가 실행시 오류가 발생하는데 왜 그런지 아무리 봐도 모르겠습니다. ㅠ 

도와주세요 ㅜ

djm03178   6년 전

main의 a와 alloc의 x는 서로 별개의 포인터입니다. alloc(a, 100);이라는 건 "a가 가리키는 주소를 x가 가리키게 하는" 역할을 할 뿐입니다.  x = (int *)malloc(sizeof(int)*n); 은 x가 어떤 할당된 메모리 공간을 가리키게 하는 것이지, a가 가리키는 주소가 변하진 않습니다.

vhxpffltm12   6년 전

무슨 말씀인지 알겠습니다.  alloc함수가  불필요하네요 감사합니다~~

djm03178   6년 전

이중 포인터를 쓰거나 리턴값을 이용하면 동작하게 할 수 있습니다.

int *alloc(int n) {

    return (int *)malloc(sizeof(int)*n);

}

...

a = alloc(100);

chogahui05   6년 전

포인터 극혐이지요..

인자를 값으로 넘겨 받아서 그런 건데요. 아마도.. 포인터를 처음 접하신 분은..

어? void alloc(int *x, int n) 

{

}

이건 참조에 의한 호출이 아니냐고 생각하실지도.. 모르겠지만. 

이건 어디까지나 main 안에 있는 int형을 가리키는 포인터 변수인 a의 값을 alloc에다가 복사한 것 뿐이죠..

그렇기 때문에 alloc 함수 내에서 복사된 x의 값만 바뀌지.. alloc 함수가 끝나고 나서

main 함수에 있는 a의 값이 바뀌지 않습니다.


쉽게 이야기 해 드리면

main 함수 내에 a라는 변수가 있었고

main 안에 func(a)를 호출했습니다.


func(int a)

{

}

이 부분에서 아무리 a의 값을 바꿔버린다고 해도.. main 안에 있는 a의 값은 변하지 않죠..

애초에 별개의 공간에 들어있기 때문이지요.


call by value 개념을 보시는 거 추천드려요.. 처음 접하시면 상당히 헷갈려 하시는 부분이더라고요.

vhxpffltm12   6년 전

두분 모두 친절한 답변 감사합니다~~

댓글을 작성하려면 로그인해야 합니다.