【问题标题】:Dynamically declaring structs not working as expected [duplicate]动态声明结构未按预期工作[重复]
【发布时间】:2017-12-12 09:57:08
【问题描述】:

我的程序出现问题,我正在尝试对其进行分解,但我发现至少在内存分配方面存在问题。

我有一个结构:

typedef struct{

    int originX;
    int originY;
    char ticBoard[3][3];
    int result;
    int turn;

} simBoard;

我希望这个结构(它的一个实例)的大小为(4 个整数 * 4 个字节)+(1 个字节字符 * 3 * 3)或 25 个字节。当我在 simBoard 上运行 sizeof() 函数时,我得到一个 28 字节的值。我假设这是我不需要担心的 25 + 3 额外。

主要问题是当我尝试声明此结构的数组时

simBoard* boardArray = (simBoard*)malloc(sizeof(simBoard)*size));

假设在这种情况下大小是一个常数。据我所知,这应该创建一个大小为 size 的 simBoard 结构数组。我应该可以去

boardArray[3]

并且得到 boardArray 的第 4 项正确?但是我遇到了内存分配的问题。当我跑步时:

printf("%zu is the size of the array\n", sizeof(boardArray));

返回值为8。我什至尝试进一步梳理问题:

simBoard* boardArray = (simBoard*)malloc(224);

当我再次运行 printf 时,我仍然得到 boardArray 的 8 个字节的值。如果你们能带领我朝着正确的方向前进,那就太棒了,因为我在这里完全被难住了。

谢谢!

【问题讨论】:

  • boardArray 是一个指针,而不是一个数组。它的大小是你平台上的指针大小,不管它指向什么。
  • 你甚至没有打印sizeof...你只是在打印指针的值。但是如果你得到8,我猜你发布的内容并不是你正在运行的内容。 :/ 你的问题是什么? “我遇到了内存分配问题。” 问题是什么?您想获得尺寸但不知道如何获得?那是程序员的问题,分配没有任何问题。这不是一个写得很清楚的问题。
  • @underscore_d 抱歉打错了,我在 printf 上做的是 `printf("%zu is the size of the array\n", sizeof(boardArray))l
  • @MatthewKerian:boardArray 不是根据 C 类型系统的数组。它的类型是“pointer to boardSim”。当您询问它的大小时,您会得到该类型的大小(指向数据的指针)。您在上一条评论中发布的内容根本不起作用。唯一在运行时设置大小的数组在 C 中称为 VLA(查找),可能不是您想要的。
  • '抱歉打错了'复制/粘贴你实际测试过的代码,否则你在浪费大家的时间:(

标签: c memory-management struct


【解决方案1】:

您确实可以使用符号boardArray[3] 索引数组中的第四个struct

请记住,boardArray 本身就是一个 指针 类型。这解释了您的 printf 输出。具有动态存储持续时间和指针类型的数组在 C 中有着千丝万缕的联系。为免生疑问,sizeof(boardArray)sizeof(simBoard*)

C 不提供获取动态数组长度的功能。您需要自己记住长度。

完成后不要忘记致电free(boardArray)。 C 运行时库将采取适当措施确保所有struct 元素都被释放。

【讨论】:

  • 嗨。所以在这种情况下,当我试图找到整个数组的大小时,我会怎么做?我的印象是,例如,要查找 int 数组中的数字数量,我可以执行 int size = (sizeof(myArray) / sizeof(int)); 之类的操作,那么 sizeof(simBoard); 不会给我数组的总大小吗?
  • @MatthewKerian:补充说。不,您需要自己记住长度。 sizeof(myArray) / sizeof(myArray[0]) 成语只适用于自动存储时长的数组。
  • 谢谢,我正在开发这个程序,但我注意到了一些别的东西。似乎sizeof(myArray) 给了我 myArray 中的全部项目?这是它的工作原理还是巧合
  • 在没有说明“myArray”是什么的情况下问这个问题有什么意义?例如,我希望它是一个堆栈分配的 char 数组。
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多