【问题标题】:How do I correctly find out, what size the array of structs is? [duplicate]如何正确找出结构数组的大小? [复制]
【发布时间】: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-&gt;things)/sizeof(var-&gt;things[0])
  • @Daniel 够了,下次试试printf("%zu\n", sizeof(...。最好不要猜测。研究printf().

标签: c arrays pointers struct


【解决方案1】:

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

typdef struct {
    char *base;
    size_t n;
} string;

注意n 属于size_t,而不是int

【讨论】:

  • 我把它设为 size_t 还是 uintXX_t 有关系吗?想详细说明一下吗?
  • @Daniel 是的,size_t 更好,因为它的大小会根据您正在编译的机器而变化。
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 2016-06-06
  • 2014-08-23
  • 2013-12-12
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多