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

C 结构成员大小大于为结构分配的内存,c,memory,struct,memory-management,memory-leaks,C,Memory,Struct,Memory Management,Memory Leaks,假设我们有一个包含一个成员(数组)的结构。根据结构的成员大小(假设为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分配的内存块大小大于为该结构分配的大小,该结构

假设我们有一个包含一个成员(数组)的结构。根据结构的成员大小(假设为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
成员设置为指向该块时,您有两个分配的对象,一个指向另一个,这没有问题,但是程序员必须在某处跟踪分配的数组的长度

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

#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;
}
#包括
#包括
结构整数向量{
int*arr;
尺寸与长度;
};  
结构int_向量*int_向量alloc(大小长度){
结构向量*v=calloc(1,sizeof(*v));
如果(v){
v->length=len;
v->arr=calloc(len,sizeof(*a->arr));
如果(v->arr==NULL){
免费(五);
v=零;
}
}
返回v;
}
void int_vector_free(结构int_vector*v){
如果(v){
自由(v->arr);
免费(五);
}
}
无效整数向量打印(常量结构整数向量*v){
如果(v){
const char*sep=“”;
printf(“[”);
用于(大小i;i长度;i++){
printf(“%s%d”,sep,v->arr[i]);
sep=“,”;
}
printf(“]”);
}
}
int main(){
struct int_vector*v=int_vector_alloc(5);
整数向量打印(v);
无内向量(v);
返回0;
}

您的结构有一个指针作为成员(而不是数组)。它只存储该指针,不存储其他内容。您可以使指针指向任何您想要的地方,但不会以任何方式影响结构的大小。@S.O.M:您可以通过单击其分数下面的灰色复选标记来接受答案。