结构成员大小大于为结构分配的内存
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 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )