问题描述
假设我们有一些结构体包含一个成员(一个数组)。根据其成员的大小(假设为 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;
}