【问题标题】:Dynamically Changing the Size of the Pointer in C++在 C++ 中动态更改指针的大小
【发布时间】:2012-01-20 01:26:32
【问题描述】:

我有以下结构

typedef struct DeviceInfo
{
    char[30] name;
    char[30] serial Number;

}DeviceInfo;

I am doing this    

DeviceInfo* m_DeviceInfo = new DeviceInfo[4];

// Populate m_DeviceInfo 

然后我想将m_DeviceInfo 的大小重新调整为 6,并希望保留 前 4 个值也是如此。

如何在 C++ 中做到这一点?

【问题讨论】:

  • 尝试使用 STL。哪个可以解决您的问题?
  • 我很惊讶有几个建议向量(包括我的)的答案被否决了!!
  • -1 不诚实地认为这是家庭作业并且没有提及限制(“不允许 STL”)。
  • KerrekSB 它的错误不是关于诚实和不诚实。我忘记更新问题了。我尊重你的判断并接受你的 -Ve 投票作为教训。谢谢Kerrek

标签: c++ struct new-operator dynamic-allocation


【解决方案1】:

1) 创建一个大小合适的新数组,并将旧数组的所有元素复制到新数组中。

2) 使用std::vector(我的推荐)。

【讨论】:

    【解决方案2】:

    您的问题有两种选择,这取决于您是否要使用 STL。

    typedef struct DeviceInfo
    {
       char[30] name;
       char[30] serial Number;
    
    } DeviceInfo;
    

    使用 STL:

    //requires vector.h
    vector<DeviceInfo> m_deviceInfo;
    
    DeviceInfo dummy;
    dummy.name = "dummyName";
    dummy.serialNumber = "1234"; 
    
    m_deviceInfo.insert(m_deviceInfo.begin(), dummy); 
    //add as many DeviceInfo instance you need the same way
    

    或没有 STL:

    //implement this 
    DeviceInfo* reallocArray(DeviceInfo* arr, int curItemNum, int newItemNumber)
    {
       DeviceInfo* buf = new DeviceInfo[newItemNumber];
    
       for(int i = 0; i < curItemNum; i++)
         buf[i] = arr[i];
    
       for(int i = curItemNum; i < newItemNumber; i++)
         buf[i] = null;
    }
    
    //and in your main code
    DeviceInfo m_DeviceInfo = new DeviceInfo[4];
    
    m_DeviceInfo = reallocArray( m_DeviceInfo, 4, 6 );
    

    【讨论】:

    • 您忘记了 reallocArray 的参数。
    【解决方案3】:

    好吧,有几种方法可以做到这一点,但是 你应该在 C++ 中使用 realloc 函数。它将重新分配连续内存,并将先前内存的值复制到新内存中。例如:

    temp_DevInfo = (DeviceInfo*) realloc (m_DeviceInfo, (2) * sizeof(struct DeviceInfo));
    free(m_DeviceInfo);
    m_deviceInfo = temp_DevInfo;
    

    你做 2 * sizeof(DeviceInfo) 因为你想再添加 2,加上前面的 4 是 6。 那么你应该释放/删除前一个对象。 最后将旧指针设置为指向您刚刚分配的新对象。

    这应该是它的要点

    查看 realloc 的文档。

    【讨论】:

    • 这不是 c++,也不是用 c++ 做的正确方法..(我没有投反对票)
    • 答案还不错,这不是 C++ 方式,而是 C 方式。但是 C++ 被设计为(大部分)是 C 的超集,所以你仍然可以用旧的方式来做......也许在没有 new 的平台上有用(不管是什么)
    【解决方案4】:

    最好的解决方案是在您的程序中使用 vector

    参考本站http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html#VECTOR

    本网站将帮助您解决问题。

    这里可以推送数据,不用担心结构的大小。

    【讨论】:

      【解决方案5】:

      m_DeviceInfo 指向由 4 个元素组成的 DeviceInfo 数组。没有使用数组调整大小。相反,您应该删除并使用 6 个元素创建它。

      DeviceInfo * m_DeviceInfo2 = new DeviceInfo[6]; 
      memcopy( m_DeviceInfo,m_DeviceInfo2, 4 );
      delete[] m_DeviceInfo;
      

      但你应该使用向量。

      std::vector<DeviceInfo> m_DeviceInfo;
      // or 
      std::vector<std::shared_ptr<DeviceInfo>> m_DeviceInfo;
      

      调整大小

      m_DeviceInfo.resize(m_DeviceInfo.size()+ 2);
      

      【讨论】:

        【解决方案6】:

        你的语法错误:

        DeviceInfo m_DeviceInfo = new DeviceInfo[4];
        

        应该是:

        DeviceInfo* m_DeviceInfo = new DeviceInfo[4];
        

        更好的选择是使用std::vector

        std::vector<DeviceInfo> vec;
        
        //populate:
        DeviceInfo inf;
        vec.push_back(inf);
        vec.push_back(inf);
        //....
        

        【讨论】:

          【解决方案7】:

          好的 C++ 方法是为此使用适当的容器。显然,您应该使用std::vector 容器,例如:

          std::vector<DeviceInfo> m_DeviceInfo;
          m_DeviceInfo.resize(4);
          

          这需要对您的 DeviceInfo 进行一些限制。特别是它应该有一个不带参数的构造函数,以及复制构造函数......

          而且你的问题措辞很糟糕。您当然不会更改sizeof(DeviceInfo*),这在 32 位机器上可能是 4 个字节,在 64 位机器上可能是 8 个字节。

          【讨论】:

            【解决方案8】:

            你不能用常规数组来做到这一点。我建议您使用vector,它可以随着您向其中添加更多元素而增长(因此您甚至不必指定初始大小)。

            【讨论】:

            • STL is not allowed 我们还有其他解决方案吗?
            • 我猜你必须自己实现数组重新分配。 “调整大小”数组的标准策略是在旧数组空间不足时分配大小加倍的新数组,从旧数组复制所有内容并释放旧数组。事实上,这几乎是在实现你自己的向量。
            猜你喜欢
            • 1970-01-01
            • 2015-05-03
            • 2017-11-20
            • 2011-01-28
            • 2019-04-01
            • 2012-03-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多