【问题标题】:Nested struct with dynamic size in C++C ++中具有动态大小的嵌套结构
【发布时间】:2019-06-27 12:40:14
【问题描述】:

我正在尝试在 showValues(mainStruct*) 中打印数据,但我无法这样做..

#include <iostream>
#include <string>
#include <vector>
#include <memory>

typedef struct
{
  uint32_t someNumber;    
}subStruct;

typedef struct{
    uint32_t sizeofSubStruct;
    subStruct subStructArray[1];
}mainStruct;

这个函数构造 mainStruct 并用一些值填充它

mainStruct* constructMainStruct()
{
    mainStruct* msPtr;
    msPtr = (mainStruct*)malloc(sizeof(mainStruct)*10);
    msPtr->sizeofSubStruct = 10;

    subStruct* ssPtr = msPtr->subStructArray;
    for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
    {
        ssPtr->someNumber = i+10;
        ssPtr++;       
    }             
    return msPtr;
}

以下函数不打印任何内容

void showValues(mainStruct* msPtr)
{
    subStruct* ssPtr = msPtr->subStructArray;
    for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
    {   
     std::cout << " - " + ssPtr->someNumber <<std::endl;
    }
}

主要功能

int main()
{
    //contructing mainStruct with some values
    mainStruct* msPtr = constructMainStruct();

    //trying to print values which has been created in above step
    showValues(msPtr);
}

【问题讨论】:

  • 灵活数组成员在 C 中,这个问题有 C++ 标签。 C++ 没有灵活的数组。您应该根据要求使用std::vectorstd::array
  • 为什么使用malloc?为什么不new?
  • 为什么要使用原始指针和原始数组?只需使用容器类,如 std::vectorstd::array
  • 在 C++ 中,灵活的数组成员习语是未定义的行为。
  • 不!不幸的是我不能使用向量或数组,它应该是原样。关于灵活数组,因为它是 c++,所以我必须给出代码中提到的大小 [1]。

标签: c++ data-structures dynamic struct nested


【解决方案1】:

您的打印问题(绝不是唯一的问题)是:

for(uint32_t i=0; i > msPtr->sizeofSubStruct; i++)

您将 i 初始化为 0,但使用“i > msPtr->sizeofSubStruct;”的测试,它应该小于而不是大于。

其他问题是你的分配大小,它应该是 sizeof(mainStruct)+sizeof(subStruct)*9,你现在拥有的 subStruct 不是一个大问题,但是一旦 subStruct 变得复杂它就会是。

【讨论】:

  • 大小应为offsetof(mainStruct, subStructArray) + sizeof(subStruct)*10。但无论如何,这可能都是 UB。
  • 是的!关于“i > msPtr->..”你是对的,在这里编写示例代码时是错字。尽管更正了这一点,但它并没有打印出来。
  • @Ali 我认为应该,但无论如何要找出发生了什么,您需要使用调试器。
【解决方案2】:

除了@SornelHaetir 已经注意到的,函数showValues 没有增加subStruct 指针。

代码应该是这样的;

void showValues(mainStruct* msPtr)
{
    subStruct* ssPtr = msPtr->subStructArray;
    for (uint32_t i = 0; i < msPtr->sizeofSubStruct; i++)
    {
        std::cout << " - " + ssPtr->someNumber << std::endl;
        ++ssPtr;
    }
}

【讨论】:

    【解决方案3】:

    以下是 showValues 的工作代码

    void showValues(mainStruct* msPtr)
    {
        subStruct* ssPtr = msPtr->subStructArray;
        for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
        {   
         std::cout << (ssPtr+i)->someNumber <<std::endl;
        }
    }
    

    完整的程序代码如下:

    #include <iostream>
    
    typedef struct
    {
      uint32_t someNumber;    
    }subStruct;
    
    typedef struct{
        uint32_t sizeofSubStruct;
        subStruct subStructArray[1];
    }mainStruct;
    
    mainStruct* constructMainStruct()
    {
        mainStruct* msPtr;
        msPtr = (mainStruct*)malloc(sizeof(mainStruct)*10);
        msPtr->sizeofSubStruct = 10;
    
        subStruct* ssPtr = msPtr->subStructArray;
        for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
        {
            ssPtr->someNumber = i+10;
            ssPtr++;       
        }             
        return msPtr;
    }
    void showValues(mainStruct* msPtr)
    {
        subStruct* ssPtr = msPtr->subStructArray;
        for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
        {   
         std::cout << (ssPtr+i)->someNumber <<std::endl;
        }
    }
    
    int main()
    {
        //contructing mainStruct with some values
        mainStruct* msPtr = constructMainStruct();
    
        //trying to print values which has been created in above step
        showValues(msPtr);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 2019-12-14
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多