C 如何正确地找出结构数组的大小?
我有下面这个最小的例子,我不明白为什么我的结构大小是错误的。我希望输出是50,而不是1。我做错了什么C 如何正确地找出结构数组的大小?,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我有下面这个最小的例子,我不明白为什么我的结构大小是错误的。我希望输出是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
#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,但它可以动态更改,我如何释放。。这是什么
是在结构中引入字段以跟踪实际数组大小的唯一选项吗?是,您需要向结构中添加另一个成员。例如,字符串包装器类型跟踪其中的字符数:
typdef struct {
char *base;
size_t n;
} string;
注意n的大小是t,而不是int。Yes…………最明智的选择是添加一个跟踪数组大小的字段。实际上,您可能需要添加两个字段,一个用于记录分配给数组的项目数,另一个用于记录正在使用的项目数。这样,您就可以优化阵列的增长方式,而不是在每次需要添加内容时重新分配阵列。替代方案包括简单地将尺寸与结构分开。这样的替代方案可能不是一个好主意。请注意,sizeof array/sizeof array[0]仅在数组是实际数组时才起作用,这对指针不起作用。如果您有指针和/或正在向函数传递数组,则需要将长度传递给函数或将其存储在其他位置。奇怪的是,您为什么选择使用%lu来匹配sizeofvar->things/sizeofvar->things[0]?@Daniel很公平,请尝试printf%zu\n,sizeof。。。下一次最好不要猜测。研究打印。我把它做成一个尺码还是一个uintXX码有关系吗?想详细说明一下吗?@Daniel是的,大小更好,因为它的大小取决于您编译的机器。