【问题标题】:Malloc for struct [duplicate]结构的 Malloc [重复]
【发布时间】:2017-12-03 14:00:25
【问题描述】:

我正在开发我的程序,该程序从外部 .txt file 加载数据 - 它是 3 个整数的结构。现在我正在努力使用分配内存的功能。我想为 9 个成员(108 字节)的结构分配内存。

我的主程序太大而无法处理,所以我创建了一个较小的程序来帮助我更轻松地弄清楚发生了什么。我之前遇到的问题对我来说似乎太复杂和不清楚,这就是我自己制作的原因。

我想知道为什么第三个printf 会打印 4 以及如何正确分配所需的内存(108 字节)

很高兴得到任何建议

 #include <stdio.h>
 #include <math.h>

    int main(){
        int object_counter = 9;

        typedef struct myStruct {
         int name;
         int age;
         int height;
        } myStruct;

        myStruct* dynamicStruct;
        dynamicStruct = malloc(object_counter*sizeof(myStruct));
        if (dynamicStruct == NULL) {
            printf("ERROR\n");
            return (-1);
        } else {
            printf("SUCCESS\n");
        }
        printf("Size is: %lu\n", sizeof(myStruct));             // prints 12, thats 3 times int, OK
        printf("Size is: %lu\n", object_counter*sizeof(struct myStruct));   // prints 108, obviously 9 times 4 bytes
        printf("Size is: %lu\n", sizeof(dynamicStruct));        // prints 4 ?? (expected 108)
        return 0;
    }

【问题讨论】:

  • 这是指针(内存地址)的大小,而不是它指向的数据(你的结构)
  • dynamicStruct 是一个 指针,在 32 位系统上通常为 4 个字节。 sizeof 在编译时评估。

标签: c malloc


【解决方案1】:

sizeof any 指针是常量(在我的 Linux/x86-64 系统上为 8 个字节,这也是 sizeof(uintptr_t) 等......)。它与指向的内存区域的运行时大小无关。换句话说,sizeof operator always 给出了一个 compile-time 常量(VLAs 除外)。

您实际上需要将malloc-ed 指针的已分配 大小保留在其他地方。例如,您可以将指针值保存在一个变量中,并将其分配的大小保存在另一个变量中。

您可以考虑使用抽象数据类型(使用flexible array members)方法,例如here

【讨论】:

  • 对于 VLA,sizeof 不是常数。
  • @BasileStarynkevitch 指针总是相同的大小,这里的 VLA 没有意义。我们在这里讨论的是指针大小,而不是实际内存。
  • 我的意思是 VLA 上的 sizeof 没有给出编译时间常数。这是规则的唯一例外
  • Right..这将是 VLA..ok gotcha 的情况下的表达式。 +1
猜你喜欢
  • 2016-02-27
  • 2017-10-03
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2018-06-21
相关资源
最近更新 更多