结构成员大小大于为结构分配的内存

问题描述

假设我们有一些结构体包含一个成员(一个数组)。根据其成员的大小(假设为 4 个字节)为结构分配内存。 也为其成员分配了内存。

struct X {
    int *arr;  
};  

int main() {
    struct X *x = (struct X *)calloc(1,sizeof(struct X));  
    x->arr = (int *)calloc(5,sizeof(int)); 
} 

现在,如果为 arr 分配的内存块大小大于为结构分配的大小,结构会发生什么情况?

解决方法

该结构只包含一个指向 int 的指针:当您为 5 个 int 的数组分配一个对象并将 arr 成员设置为指向该块时,您分配了 2 个对象,一个指向另一个,没有问题,但程序员必须在某处跟踪分配的数组的长度。

事实上,如果您将 length 成员添加到您的结构中,您将拥有一个对象,您可以在其中存储可变数量的 int 值,即 int_vector

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

struct int_vector {
    int *arr;
    size_t length;
};  

struct int_vector *int_vector_alloc(size_t len) {
    struct vector *v = calloc(1,sizeof(*v));
    if (v) {
        v->length = len;
        v->arr = calloc(len,sizeof(*a->arr));
        if (v->arr == NULL) {
            free(v);
            v = NULL;
        }
    }
    return v;
}

void int_vector_free(struct int_vector *v) {
    if (v) {
        free(v->arr);
        free(v);
    }
}

void int_vector_print(const struct int_vector *v) {
    if (v) {
        const char *sep = "";
        printf("[");
        for (size_t i; i < v->length; i++) {
            printf("%s%d",sep,v->arr[i]);
            sep = ",";
        }
        printf(" ]");
    }
}

int main() {
    struct int_vector *v = int_vector_alloc(5);
    int_vector_print(v);
    int_vector_free(v);
    return 0;
}