malloc () 및 realloc () 구조

Sep 30 2020

구조에 메모리를 동적으로 할당 할 수 있습니까? 동적으로 할당 된 구조에 접근하는 올바른 절차입니까? 방법 malloc()과 realloc()구조 를 가르쳐주세요 .

newnode는 struct List * 유형이지만 인덱싱을 시작할 때 struct List로 변환됩니다.이 변환이 어떻게 가능합니까? 내 삽입 함수는 (struct List *) 만 허용합니까?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct List {
    char val[20];
};

void insert(struct List *);

int main(void) {
    int i = 0;
    int size = 1;
    struct List *newnode = (struct List *)malloc(size * sizeof(struct List));
    for (i = 0; i < 5; i++) {
        if (size <= i) {
            size = size + size;
            newnode = (struct List *)realloc(newnode, size * sizeof(struct List));
        }
        scanf("%s", newnode[i].val);
        insert(newnode[i]);
    }
    for (i = 0; i < 5; i++) {
        printf("%s\n", newnode[i].val);
    }
    return 0;
}

void insert(struct List *node) {
    printf("%s\n", node->val);
}

답변

1 chqrlie Sep 30 2020 at 00:34

코드는 3 가지 문제를 제외하고 작동합니다.

  • 메모리 할당 실패를 테스트하지 않습니다. 메모리를 할당 할 수없는 경우 malloc()및 둘 다 realloc()반환 NULL됩니다 newnode. 역 참조 가 발생 하면 정의되지 않은 동작 이 발생합니다.

  • realloc()실패한 경우를 정상적으로 처리하려면 할당 해제되지 않은 이전 배열에 계속 액세스하여 해제 할 수 있도록 재 할당 된 포인터를 다른 변수에 저장해야합니다.

  • scanf("%s", newnode[i].val); 보안 결함입니다. 다음을 사용하여 대상 배열에 저장할 수있는 바이트 수를 제한해야합니다.

    scanf("%19s", newnode[i].val);
    
  • scanf()유효하지 않거나 누락 된 입력을 감지하기 위해 의 반환 값을 테스트하지 않습니다 .

  • insert()아무것도 삽입 하지 않습니다 .

다음은 오류 처리와 덜 혼동되는 이름이있는 수정 된 버전입니다.

#include <stdio.h>
#include <stdlib.h>

struct Item {
    char val[20];
};

//void insert(struct Item *);

int main(void) {
    int i, j;
    int size = 0;
    struct Item *array = NULL;
    for (i = 0; i < 5; i++) {
        if (i >= size) {
            int newsize = size ? 1 : size + size;
            struct Item *newarray = realloc(array, sizeof(*array) * size);
            if (newarray == NULL) {
                perror("cannot reallocate the array");
                break;
            }
            size = newsize;
            array = newarray;
        }
        if (scanf("%19s", array[i].val) != 1) {
            fprintf(stderr, "missing input\n");
            break;
        }
        //insert(array[i]);
    }
    for (j = 0; j < i; i++) {
        printf("%s\n", array[i].val);
    }
    free(array);
    return 0;
}