2009-11-28 4 views
0
typedef struct unit_class_struct { 
    char *name; 
    char *last_name; 
} person; 


int setName(person *array) { 

    array[0].name = strdup("Bob"); 
    array[1].name = strdup("Dick"); 

    return 1; 
} 

int setLastName(person *array) { 

    array->last_name = strdup("Sanchez"); 
    array++; 
    array->last_name = strdup("Clark"); 

    return 1; 
} 

int main() 
{ 
    person array[10]; 
    person *pointer; 
    pointer = array; 
    setName(pointer); 
    setLastName(pointer); 
    printf("First name is %s %s\n", array[0].name, array[0].last_name); 
    printf("Second name is %s %s\n", array[1].name, array[1].last_name); 
    while(1) {} 
    return 0; 
} 

이것은 구조로 놀아 보았던 몇 가지 예제 코드입니다. setName에서 이름을 설정하는 방법과 setLastName에서 설정 한 방식에 유의하십시오.구조체를 참조로 전달하고 조작하기

두 가지 모두 작동하지만 두 가지 방법의 차이점은 무엇인지 궁금합니다.

다른 방법보다 나은 점은 무엇입니까?

이 예제에서는 strdup이 필요합니까? 그렇지 않다면 array.name을 문자열 리터럴이 아닌 임의의 크기의 변수로 설정해야 할 필요가 있습니까?

답변

0

인덱스 방식을 사용하면 포인터 계산을 사용하는 것보다 약간 더 명확하지만, 내 의견으로는 어느 것이 든 작동합니다. 필자는 컴파일러가 생성하는 코드가 두 인스턴스 모두에서 매우 유사하다고 생각합니다.

strdup은 문자열을 person 구조체에 저장하기 위해 메모리를 할당하지 않기 때문에 변수로 작업하는 경우이 인스턴스에 필요합니다. setter 중 하나가 호출되었을 때 이미 해당 문자열에 대한 공간을 할당했다면 strcpy (strcpy_s, 가능하면)이면 충분합니다.

예제 에서처럼 리터럴을 사용하는 경우 strdup은 필요하지 않습니다. char*에 직접 할당 할 수 있습니다.

1

모든 .name을 문자열 상수로 설정하면 no, strdup이 반드시 필요하지 않습니다. 나중에 문자열을 수정할 예정이라면 필요할 것입니다. 포인터와 메모리 관리에있어 더 나은 접지는 구별을 명확하게 할 것입니다. strdup을 사용하는 경우 나중에 결과가 free이어야합니다.

1

두 옵션 모두 배열의 길이를 모르기 때문에 매우 위험합니다. 따라서 배열 ++ 또는 array [1]의 결과에 액세스하면 정의되지 않은 동작이 발생할 수 있습니다.

아마 당신은 양이 라스트 네임 배열의 길이가이 apprach

int set_last_name(person* array, char* lastnames[],size_t amount){ 
    int i=0; 

    for(;i<amount;i++,array++){ 
     strncpy(array->lastname,lastnames[i],strlen(lastnames[i])); 
    } 

    return 1; 
} 

을 시도 할 수 있습니다.

strdup는 사용하지 않습니다. 이 함수는 사용자가 lastnames와 array에 메모리를 할당 할 것으로 기대합니다. 그런 다음 사용자는 필요한 경우 해당 메모리를 확보해야합니다. strdup는 힙 할당 문자열을 반환하기 때문에 strdup를 싫어합니다. 함수의 경우에는 함수 사용자가 함수를 해제해야한다는 것을 명확히 문서화해야합니다.

0

array->name은 정확히 (*array).name과 같습니다.

"배열"은 구조체에 대한 포인터이므로 *arrayarray[0]은 모두 구조체이며 해당 멤버를 설정할 수 있습니다. 화살표 표기법은 자주 사용되는 바로 가기입니다.