【发布时间】:2018-02-02 01:23:11
【问题描述】:
我有以下最小示例,但我不明白,为什么我的结构大小是错误的。我期望输出为 50,而不是我得到 1。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
typedef struct prod {
char *x;
} prod_t;
typedef struct obj {
prod_t *things;
} obj_t;
#define LARGE_BUF 100
#define CHAR_BUF 20
obj_t *func1(obj_t *t) {
t->things = malloc(sizeof(prod_t) * LARGE_BUF);
for (uint16_t i = 0; i < 50; i++) {
t->things[i].x = malloc(sizeof(char) * CHAR_BUF);
t->things[i].x = "hello";
}
return t;
}
int main(int argc, char **argv) {
obj_t *var = malloc(sizeof(obj_t));
var = func1(var);
printf("%lu\n", sizeof(var->things)/sizeof(var->things[0]));
return 0;
}
由于我没有条目数,为我生成的函数(现在是 50,但它可以动态变化),我该如何free(..) 这个呢?
是在结构中引入字段以跟踪实际数组大小的唯一选择吗?
【问题讨论】:
-
是的............
-
最明智的选择是添加一个跟踪数组大小的字段。您可能想要添加两个字段,实际上,一个记录分配给数组的项目数,另一个记录正在使用的项目数。这样你就可以优化你的阵列增长方式,而不是每次你需要添加一些东西时重新分配。替代方案包括简单地将尺寸与结构分开。这样的替代方案可能不是一个好主意。
-
请注意,
sizeof array / sizeof array[0]仅在array是实际数组时有效,这不适用于指针。如果您有指针和/或将数组传递给函数,则需要将长度传递给函数或将其存储在其他地方。 -
好奇,你为什么选择用
"%lu"来匹配sizeof(var->things)/sizeof(var->things[0])? -
@Daniel 够了,下次试试
printf("%zu\n", sizeof(...。最好不要猜测。研究printf().