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

Posted

技术标签:

【中文标题】结构成员大小大于为结构分配的内存【英文标题】:Struct member size is bigger than the memory allocated for the struct 【发布时间】:2021-06-04 17:54:39 【问题描述】:

假设我们有一些结构包含一个成员(一个数组)。根据其成员的大小(假设 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 的内存块大小大于分配给结构的大小,结构会怎样?

【问题讨论】:

您的结构有一个指针作为成员(不是数组)。它只存储那个指针,没有别的。您可以将该指针指向您想要的任何位置,不会以任何方式影响结构的大小。 @S.O.M:您可以通过点击分数下方的灰色复选标记来接受答案。 【参考方案1】:

该结构仅包含一个指向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;

【讨论】:

以上是关于结构成员大小大于为结构分配的内存的主要内容,如果未能解决你的问题,请参考以下文章

c语言中,系统为结构类型变量所分配的内存空间大小如何确定?

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

C 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

c语言中:结构体的内存分配

c语言中:结构体的内存分配

C语言中结构体变量所占内存大小的计算