Динамическое изменение размера указателя в C ++ - PullRequest
0 голосов
/ 14 декабря 2011

У меня следующая структура

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 значения, а также.

Как это сделать на с ++?

Ответы [ 8 ]

6 голосов
/ 14 декабря 2011

Вы не можете сделать это с обычными массивами. Я предлагаю вам использовать vector , который может расти по мере добавления к нему большего количества элементов (поэтому вам даже не нужно указывать начальный размер).

3 голосов
/ 14 декабря 2011

В вашей задаче есть два варианта, и это зависит от того, хотите вы использовать 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 );
3 голосов
/ 14 декабря 2011

1) Создайте новый массив размера, который подходит, и скопируйте все элементы старого массива в новый.

2) Используйте std::vector (моя рекомендация).

3 голосов
/ 14 декабря 2011

Хороший способ C ++ - использовать соответствующий контейнер для этого. Очевидно, вы должны использовать контейнер std :: vector , например:

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

Это требует некоторых ограничений для вашего DeviceInfo . В частности, он должен иметь конструктор без аргументов и копировать конструкторы ...

И ваш вопрос плохо сформулирован. Вы, конечно, не меняете sizeof(DeviceInfo*), что, вероятно, составляет 4 байта на 32-битной машине и 8 байтов на 64-битной.

2 голосов
/ 14 декабря 2011

Лучшее из возможных решений - использовать vector в вашей программе.

См. Этот сайт http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html#VECTOR

Этот сайт поможет вам решить вашу проблему.

Здесь вы можете отправить данные. Не нужно беспокоиться о размере структуры.

2 голосов
/ 14 декабря 2011

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);
1 голос
/ 14 декабря 2011

Ваш синтаксис неправильный:

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);
//....
0 голосов
/ 14 декабря 2011

ну, есть несколько способов сделать это, но Вы должны использовать функцию realloc в c ++. он перераспределяет непрерывную память, а также копирует значение предыдущей памяти в новые. например:

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

вы делаете 2 * sizeof (DeviceInfo), потому что вы хотите добавить еще 2, плюс предыдущие 4 - 6. тогда вы должны освободить / удалить предыдущий объект. и, наконец, установите старый указатель так, чтобы он указывал на только что выделенный объект.

это должно быть суть

посмотрите документацию по realloc.

...