【问题标题】:Initialize dynamically allocated structures within dynamically allocated structures在动态分配的结构中初始化动态分配的结构
【发布时间】:2015-07-23 20:40:00
【问题描述】:

我想在结构中动态分配结构。我想我可以做到这一点。但是,当我想对它们执行操作时,在 Visual C++ 下会出现访问冲突错误。也许初始化有问题。顺便说一句,我怎样才能初始化动态分配的myDynamicMembersBinArray?我尝试了以下方法:

#include <stdio.h>
#include <stdlib.h>



int main()
{
    /* ========== Define structures ========== */

    /* Create just the identifier */
    struct bin{
        char *tag;
        float size;
    };
    /* Declare another structure which will hold the bin structure */
    struct dynamicbin{
    struct bin *binPointer;
    };
    /* I use calloc so that zero-filling is done */
    myDynamicMembersBinArray = (struct dynamicbin*)calloc(1, sizeof(struct dynamicbin));
    struct bin *binpointer = (struct bin*)calloc(N, sizeof(struct bin));

    /* This one fails */
    for (int i=0; i<N; i++){
        printf("%f\n", (*(*myDynamicMembersBinArray).binPointer+i).size);
    }

提前谢谢你。

【问题讨论】:

  • 不要转换malloc() & al的结果。实际上不要将 void * 转换为任何其他指针类型。此外,`malloc()` & co 可能返回 NULL。 总是检查这个。
  • 感谢您的建议。首先,我只是想让分配工作。

标签: c struct calloc


【解决方案1】:

这个:

struct bin *binpointer = (struct bin*)calloc(N, sizeof(struct bin));

应该是:

(*myDynamicMembersBinArray).binpointer = calloc(N, sizeof(struct bin));

请注意,我摆脱了演员阵容。请参阅this answer 了解原因(请记住,在 C++ 中,您确实需要强制转换。但在 C 中它是错误的并且可以隐藏错误)。

【讨论】:

  • *myDynamicMembersBinArray 需要在括号中才能正确工作,并且在 C 中强制转换 malloc 的返回值并没有错,这样做只是不好。
【解决方案2】:

你没有声明myDynamicMembersBinArray:
struct dynamicbin* myDynamicMembersBinArray = calloc(1, sizeof(struct dynamicbin));

struct bin *binpointer = (struct bin*)calloc(N, sizeof(struct bin)); 应该是
(*myDynamicMembersBinArray).binPointer = calloc(N, sizeof(struct bin));
*myDynamicMembersBinArray 周围的括号很重要)或更好
myDynamicMembersBinArray-&gt;binPointer = calloc(N, sizeof(struct bin));

最后但并非最不重要
printf("%f\n", (*(*myDynamicMembersBinArray).binPointer+i).size); 应该是
printf("%f\n", *((*myDynamicMembersBinArray).binPointer+i).size);
(注意 * 移到括号外)或更好
printf("%f\n", myDynamicMembersBinArray-&gt;binPointer[i].size);

【讨论】:

  • 感谢您的回答。我创建了 myDynamicMembersBinArray,但忘记将其粘贴到此处的代码中。在我更正了其他两件事后,会出现错误消息,即:在“myDynamicMembersBinArray->binpointer = calloc(N, sizeof(struct bin));”的情况下void* 类型的值不能分配给 bin 类型的实体。如果是 "printf("%f\n", *((*myDynamicMembersBinArray).binPointer+i).size);"表达式必须具有类类型。正如我所提到的,我使用 Visual C++。
  • 我意识到第一个问题是关于 C++ 开发环境的。我在 tcc 上运行它,它变得正常。但是对于 printf 部分 tcc 说:lvalue expected.
  • 如果我这样写就可以了:printf("%f\n", (*(*myDynamicMembersBinArray).binPointer).size);
  • printf("%f\n", (*(*myDynamicMembersBinArray).binPointer).size); 将始终打印索引为 0 的那个,而不是索引为 i 的那个。这将起作用:ideone.com/x9VrtD
  • 我的最后一个问题是:当myDynamicMembersBinArray 被分配为M 的大小时是什么情况,即:const int M = 4; struct dynamicbin* myDynamicMembersBinArray = calloc(M, sizeof(struct dynamicbin)); 在这种情况下for (int j=0; j&lt;M; j++) for (int i=0; i&lt;N; i++){ printf("%f\n", myDynamicMembersBinArray-&gt;binPointer[i].size); } 将不起作用。不知何故,我不得不踩指针myDynamicMembersBinArray
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多