0

我有以下结构

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++ 中做到这一点?

4

8 回答 8

6

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

于 2011-12-14T08:53:27.887 回答
3

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

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

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

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

于 2011-12-14T08:55:17.503 回答
3

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

2)使用std::vector(我的建议)。

于 2011-12-14T08:56:31.957 回答
3

m_DeviceInfo指向一个DeviceInfo由 4 个元素组成的数组。没有使用数组调整大小。相反,您应该删除并使用 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);
于 2011-12-14T08:58:27.737 回答
3

您的问题有两个选项,这取决于您是否要使用 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 );
于 2011-12-14T09:30:08.403 回答
2

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

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

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

在这里您可以推送数据。无需担心结构的大小。

于 2011-12-14T08:58:31.310 回答
1

您的语法错误:

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);
//....
于 2011-12-14T08:56:54.297 回答
0

有几种方法可以做到这一点,但你应该使用 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 的文档。

于 2011-12-14T09:00:21.593 回答