2012-10-22 3 views
0

나는 C에서 완전히 새로운 기능으로 배열을 초기화하려고했습니다.함수에서 초기화 배열

주 방법의 값을 인쇄하려면 항상 세그먼트 오류가 발생하기 때문에 작동하지 않습니다.

static void array(int *i) 
{ 
    int j = 0; 
    i = (int *) malloc(5 * sizeof (int)); 
    for (j = 0; j < 5; j++) { 
     i[j] = j; 
    } 

    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", i[j]); 
    } 
} 

/* Main entry point */ 
int main(int argc, char *argv[]) 
{ 
    int j; 
    int *i = NULL; 

    array(i); 
    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", i[j]); 
    } 
    return 0; 
} 

누군가가 코드를 수정하고 작동 방식을 설명 할 수 있다면 좋을 것입니다.

+3

'난 = (INT의 *)의 malloc (5 * sizeof 연산자는 INT가)(); '에만 영향을 포인터가 호출자의 포인터가 아니라 포인터의 사본. 내가 중복 된 것을 찾아 보자. –

+0

즉, 포인터는 참조가 아닌 값으로 전달되므로 업데이트되지 않습니다. array() 함수를 끝낼 때 원래 값을 얻었습니다. – m0skit0

+0

'malloc'의 결과를 캐스트하지 마십시오. – chris

답변

3
static void array(int **i) 
{ 
    int j = 0; 
    *i = malloc(5 * sizeof (int)); 
    for (j = 0; j < 5; j++) { 
     (*i)[j] = j; 
    } 

    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", (*i)[j]); 
    } 
} 

/* Main entry point */ 
int main(int argc, char *argv[]) 
{ 
    int j; 
    int *i = NULL; 

    array(&i); 
    for (j = 0; j < 5; j++) { 
     printf("Hello: %d\n", i[j]); 
    } 
    return 0; 
} 

포인터를 값으로 배열에 전달하므로 포인터 대신 포인터를 전달한 다음 설정/사용하십시오.


당신이 malloc을의 결과를 캐스팅 안되는 이유에 관해서는 다음을 참조하십시오 Do I cast the result of malloc?Specifically, what's dangerous about casting the result of malloc?

+0

다른 배열을이 배열 int로 복사하려고합니다. 어떻게 작동합니까? memcpy (* i, j, 5 * sizeof (int)); 이 기능에서 * i가 아닌 & i를 사용해야하는 이유는 무엇입니까? – MeJ

+0

& i를 사용하고 있지 않습니까? – farmdve

+0

아니요 * i를 사용해야합니다. 그렇지 않으면 작동하지 않지만 왜 작동합니까? – MeJ

1

함수 내에서 변수에 메모리를 할당하려면 포인터에 대한 포인터를 함수 인수로 전달하고 포인터를 역 참조 한 다음 메모리를 할당해야합니다.

또는 의사 코드

function(int **i) 
{ 
    *i = malloc... 
} 
int *i = NULL; 
function(&i); 

이 그것을 할 수있는 방법 중 하나입니다에

. malloc이 반환하는 포인터를 반환 할 수도 있습니다. 그리고 내가 읽은 자료에서 반환 유형의 malloc을 캐스트하지 않는 것이 좋습니다.