Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何正确地找出结构数组的大小?_C_Arrays_Pointers_Struct - Fatal编程技术网

C 如何正确地找出结构数组的大小?

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

我有下面这个最小的例子,我不明白为什么我的结构大小是错误的。我希望输出是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,但它可以动态更改,我如何释放。。这是什么


是在结构中引入字段以跟踪实际数组大小的唯一选项吗?

是,您需要向结构中添加另一个成员。例如,字符串包装器类型跟踪其中的字符数:

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是的,大小更好,因为它的大小取决于您编译的机器。