2009-11-29 5 views
0

구조체 배열 포인터와 구조체 배열 포인터에 대한 포인터를 함수로 전달한 다음 리턴을 사용하지 않고 수정하려고합니다.함수에 전달 된 포인터를 통해 구조체 배열 수정하기

이 예제 코드는 참으로 무의미합니다. 저의 학습 예제입니다.

기본적으로 array [0] ... array [1] .. array [2] 등등을 만들고 다른 인덱스를 사용하는 동안 ... array_ref [2]와 같은 포인터를 가리키고 싶습니다. ]는 array [0]을 가리키고 array_ref [3]은 array [1]을 가리 킵니다.

아래의 코드는 컴파일되지만 즉시 충돌합니다. 어떤 제안?

typedef struct unit_class_struct { 
    char *name; 
    char *last_name; 
} person; 




int setName(person * array, person ***array_ref) { 
    array[0].name = strdup("Bob"); 
    array[1].name = strdup("Joseph"); 
    array[0].last_name = strdup("Robert"); 
    array[1].last_name = strdup("Clark"); 

*array_ref[2] = &array[0]; 
*array_ref[3] = &array[1]; 

    return 1; 
} 



int main() 
{ 
    person *array; 
    person **array_r; 

    array = calloc (5, sizeof(person)); 
    array_r = calloc (5, sizeof(person)); 

    setName(array,&array_r); 

    printf("First name is %s %s\n", array_r[2]->name, array_r[2]->last_name); 
    printf("Second name is %s %s\n", array_r[3]->name, array_r[3]->last_name); 

    return 0; 
} 

답변

2

구조체의 배열을 할당하고 있지만 포인터 배열을 선언하고 있습니다.

Calloc() 및 malloc()은 모든 것에 할당 할 수있는 void * 객체를 반환합니다. 따라서 심지어 -Wall으로 프로그램이 경고없이 컴파일됩니다.

그러나 실제로는 포인터가 포인터라고하는 배열을 처리하려고 시도합니다. 사실 포인터의 포인터에 대한 포인터 배열입니다. 이 포인터들 중 어느 것도 생성되지 않습니다. 당신이 시작하는 것은 하나의 객체 배열에 대한 하나의 레벨 포인터입니다. `; array_r`[I] = array_r_real + I : 당신이 정말로 원하는에 따라

array_ref[2] = &array[0]; 
    array_ref[3] = &array[1]; 

    return 1; 
} 


int main() 
{ 
    person *array, *array_r_real; 
    person **array_r; 

    array = calloc(5, sizeof(person)); 
    array_r_real = calloc(5, sizeof(person)); 
    array_r = calloc(5, sizeof(struct unit_class_struct *)); 
    int i; 
    for (i = 0; i < 5; ++i) 
     array_r[i] = &array_r_real[i]; 

    setName(array, array_r); 
+0

사실 내 프로그램을 한 경우, 내가 사용했을 수도 ... 같은 더 뭔가를해야 할 수도 있습니다 – DigitalRoss

관련 문제