2012-03-13 2 views
1

구조 배열을 확장하는 적절한 방법일까요?구조 배열 확장

typedef struct { int x,y,z;} student_record; 

int main(){ 

student_record data_record[30];  // create array of 30 student_records 
num_of_new_records = 5; 

data_record = realloc(data_record,(sizeof(data_record) + (sizeof(student_record)*num_of_new_records))); 

// do I now have an array of 35 student_records??? 

답변

4

아니요 - 배열에 할당 할 수 없습니다. 코드가 컴파일되지 않습니다. 시도해 보셨습니까?

당신이 malloc() (또는 친척 중 하나)를 사용해 필요 realloc()하려면

:

student_record *data_record = malloc(sizeof(student_record) * 30); 

당신은 아마 하나, 원래 변수에 realloc()의 반환 값을 할당 할 수 없습니다. 어떤 이유로 든 실패하면 원래 포인터를 잃어 버리고 해당 메모리가 누출됩니다.

+0

그래서 어떤 방법을 사용해야합니까? 큰 크기의 새 임시 배열을 만들고 복사 한 다음 malloc()을 원하는 크기로 다시 복사 한 다음 다시 복사 하시겠습니까? –

+0

'realloc()'을 사용하려면 배열을 사용하지 마십시오. 포인터와'malloc()'을 사용하십시오. –

1

초기 크기를 calloc'ing하고 필요할 때 realloc을 사용하는 패턴을 따라야합니다. realloc'ing을위한 안전한 연습은 임시 변수에 반환 된 초기 값을 할당하고 오류가 없다는 것을 확인한 후 첫 번째 값을 덮어 쓰는 것을 포함해야합니다. 이런 식으로 :

student_record *data_record = malloc(sizeof(student_record) * 30); 
student_record *tmp; 

// need larger size 
if ((tmp = realloc(data_record, new_size)) == NULL) 
    perror(); //possibly exit as well since you're out of memory 
else 
    data_record = tmp; 
1

힙 (동적 할당)에있는 객체에만 realloc을 사용할 수 있으므로 먼저 malloc을 사용해야합니다.

typedef struct { int x,y,z;} student_record; 

int main() 
{ 
    student_record *data_record = malloc(sizeof(student_record)*30); 
    assert(data_rocord); 
    data_record = realloc(data_record, sizeof(student_record)*35); 
    assert(data_record); 
    free(data_record); 
    exit(EXIT_SUCCESS); 

}