멤버 포인터 및 유연한 배열과 장단점

구조체 멤버에 대한 포인터:

        구조의 특정 항목의 구성원 수가 고정되지 않은 경우 구성원 수 + 포인터 + 힙 메모리를 사용하여 실제 상황에 따라 구성원을 저장할 수 있습니다.예를 들어 다른 학년 학생의 학년 수는 불확실한.

사용 예:

typedef struct Student
    {
        int id;
        char name[20];

        int score_cnt;
        float* score;
    }Student;

    // 定义成员,使用栈内存
    Student stu = {1001,"hehe",2};
    stu.score = malloc(sizeof(*stu.score)*stu.score_cnt);
    free(stu.score);

    // 定义成员,使用堆内存
    Student* stup = malloc(sizeof(Student));
    stup->score = malloc(sizeof(*stup->score)*stup->score_cnt);

메모리 해제:

 free(stup->score);
    free(stup);

참고: 구조체 변수가 정의되어 있든 관계없이 멤버 포인터에 대해 힙 메모리를 별도로 할당해야 합니다. 그렇지 않으면 멤버 포인터가 와일드 포인터이므로 구조체 변수를 사용한 후 별도로 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생합니다.

유연한 어레이:

    구조체의 특정 항목의 멤버 수가 고정되어 있지 않은 경우 구조체 끝에 길이가 0인 배열을 정의할 수 있는데, 이러한 배열을 가변 배열이라고 합니다.구조체에 더 많은 메모리를 할당할 때 가변적으로 할당된 메모리가 많을수록 유연한 배열 사용이라고 합니다.

 typedef struct Student
    {
        int id;
        char name[20];
        int score_cnt;
        float score[]; // 柔性数组
    }Student;

    Student* stup = malloc(sizeof(Student)+sizeof(stup->score[0])*len);
    stup->score = len;

    for(int i=0; i<stup->score_cnt; i++)
    {
        scanf("%f",&stup->score[i]);
    }

    free(stup)

멤버 포인터와 유연한 배열의 장단점:

 멤버 포인터 사용의 단점:

        1. 두 번 할당하고 두 번 해제해야 사용하기 번거롭다.

        2. 고위험, 와일드 포인터 및 메모리 누수가 발생하기 쉽습니다.

        3. 구조체 변수와 멤버 포인터가 가리키는 메모리는 두 개의 독립적인 메모리 블록으로, 메모리 조각화되기 쉽습니다.

        4. 멤버 포인터는 구조에서 4|8바이트의 공간을 차지하며 정렬 및 패딩을 고려하면 더 많은 메모리가 낭비됩니다.

    유연한 어레이의 장점:

        1. 사용이 간편하고 플렉시블 어레이에 별도로 메모리를 할당할 필요가 없고, 구조체 변수에 더 많은 메모리를 할당하기만 하면 됩니다.

        2. 높은 보안, 유연한 배열은 구조의 오류 문자일 뿐이므로 와일드 포인터는 사용되지 않습니다.

        3. 플렉시블 어레이가 사용하는 메모리 블록은 구조체 변수와 통합되어 구조체 변수의 메모리와 함께 할당 및 해제되므로 메모리 누수 및 메모리 조각이 발생하기 쉽지 않습니다.

        4. 메모리를 절약하기 위해 유연한 배열은 구조의 마커일 뿐이며 구조의 추가 메모리를 차지하지 않으며 구조의 총 바이트 수를 계산할 때 유연한 배열은 계산에 포함되지 않습니다.

    유연한 어레이의 단점:

        이 구문은 C99 구문 표준에서 제안 및 구현되었으며, C89만 지원하는 초기 컴파일러는 이 사용법을 지원하지 않았고 범용성이 강하지 않았습니다.

추천

출처blog.csdn.net/m0_62480610/article/details/125927536