>

내 의도가 동적 크기의 구조체 배열을 만들려는 경우. 누군가가 배열의 크기를 조정하기 위해 메모리를 할당하는 한 가지 방법이 어떻게 작동하는지 설명 할 수 있습니까? x 개의 요소가 배열에 추가 된 후 실패한 것과 비교할 때?

다음 방법은 malloc() 를 사용합니다.  (틀리게). 누군가가 배열에 메모리를 올바르게 할당하는 방법을 설명 할 수 있습니까?

struct some_struct{...data members...}*collection = NULL;
    int total_elements;
    int space_allocated; // the number of elements allocated to the array
    void resize_array(){
        if(total_elements == space_allocated) {
            if(space_allocated == 0)
                space_allocated =2;
            else
                space_allocated *= 2;
            //where collection is a pointer to a struct
            collection = malloc(space_allocated * sizeof(struct some_struct));
            if(collection == NULL){
                fprintf(stderr,"NO MEMORY ALLOCATED");
                exit(EXIT_FAILURE);
            }
        }
    }

realloc() 를 사용하는 다른 방법과 비교  배열에 메모리를 동적으로 올바르게 할당합니다. 메모리를 유지하는 데 사용되는 void * 유형 변수의 의미는 무엇입니까?

   void resize_array(){
        if(total_elements == space_allocated){
            if(space_allocated == 0)
                space_allocated = 2;
            else
                space_allocated *= 2;
                //why is a variable of type void allowed? What does that mean?
                void* tmp = realloc(collection, ((num_allocated)*
                sizeof(struct some_struct)));
                if(!_tmp){
                    fprintf(stderr,"NO MEMORY ALLOCATED");
                    exit(EXIT_FAILURE);
                }
                //what is the significance of the pointer cast?
                collection = (some_struct*) _tmp;
        }
    }


  • 답변 # 1

    malloc 를 사용하여 첫 번째 초기화를 할당해야합니다 realloc 로 크기를 조정하십시오. .

    당신이 malloc 때  첫 번째 방법으로 (완전히 말도 안되는) 시스템은 새로운 메모리 공간을 할당하고 주소를 반환합니다. 이제 하나의 메모리 누수가 발생했습니다.

    두 번째 방법은 논리적으로 보이고 일부 컴파일러 옆에서 realloc 를 기억하십시오.   malloc 대신에 사용될 수있었습니다 (재 할당 메모리는 NULL 입니다. )이지만 malloc 를 사용하여 첫 번째 초기화를 수행 할 수 있습니다  친절을 무시하십시오.

    모두 realloc  그리고 malloc   void* 를 반환 하지만 결국에는 모두 바이트입니다 ( char ). C는 약하기 때문에 리턴 타입을 타입 (포인터)으로 캐스팅하거나 캐스팅하지 않을 수 있습니다. 그러나 C ++에서는 차이가 있습니다.

  • 답변 # 2

    void * 를 사용할 수 있습니다  유형이지만 올바른 유형을 사용하는 것을 선호합니다

    struct some_struct *tmp = realloc(collection, num_allocated * sizeof *tmp);
    
    

    임시 변수는 오류 경로에서 메모리 누수를 피하기 위해 사용됩니다 :

    if (!tmp) {
        perror("realloc()");
        free(collection);
        goto err;
    }
    collection = tmp;
    
    

    언제나 realloc() 를 사용할 수 있습니다  때 collection   NULL 로 초기화됩니다 . 그러나 당신은 num_allocated * sizeof *tmp 를 확인해야합니다  넘치지 않습니다.

관련 자료

  • 이전 swift - UIImage 배열을 디스크에 저장
  • 다음 javascript - API 응답 후 반응 구성 요소 렌더링