【问题标题】:How to calculate the amount of memory needed for a struct with variable length?如何计算可变长度结构所需的内存量?
【发布时间】:2012-11-17 21:11:57
【问题描述】:

给定一个这样的结构:

struct a {
    int b;
    int c;
    my_t d[];
}

我必须将什么传递给malloc 才能为struct a 其中d 具有n 元素分配足够的内存?

【问题讨论】:

    标签: c malloc sizeof


    【解决方案1】:
    struct a *var = malloc(sizeof(*var) + n*sizeof(var->d[0]))
    

    使用sizeof 的变量将确保在类型更改时更新大小。否则,如果您更改 dvar 的类型,如果您忘记更新任何相应的分配,则可能会因未分配足够的内存而引入静默且可能难以发现的运行时问题。

    【讨论】:

    • 我最喜欢这个答案,因为它避免了重复类型名称。重构时重复类型名称会导致可疑错误。
    • 我原则上同意,但我必须指出,你是在重复一个变量名,如果变量名被更改会导致损坏,以及一个成员名,导致......
    • @pascual 在您更改内容并忘记更新时更好的编译器错误,而不是在更改类型时出现静默运行时错误。
    • @Pascal 你提出了一个有效的观点。但是,重复成员名称的不同之处在于,如果您更改成员名称,您的代码将无法编译。如果更改类型,编译时不会出错,但运行时可能会出错。
    • 很好的答案,但我认为你还没有完成你的最后一个。
    【解决方案2】:

    您可以使用例如:sizeof(struct a) + sizeof(my_t [n])

    typedef int my_t;
    
    struct a {
      int b;
      int c;
      my_t d[];
    };
    
    int n = 3;
    
    main(){
      printf("%zu %zu\n", sizeof(struct a), sizeof(my_t [n]));
    }
    

    结果:8 12

    【讨论】:

      【解决方案3】:

      这就够了:

      sizeof(a) + n * sizeof(my_t)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 2020-07-18
        • 2015-09-21
        • 1970-01-01
        • 2011-10-03
        相关资源
        最近更新 更多