У меня довольно странный вопрос, который, вероятно, не имеет практического смысла, но ответы меня сильно беспокоят.Сегодня я попытался немного поработать с массивами и с тем, как они распределяются в памяти, используя этот код: (компилятор Xcode 4, 4 байта)
int ***c;
int size_x = 0;
int size_y = 0;
int size_z = 0;
cout << "Enter x: " << endl;
cin >> size_x;
cout << "Enter y: " << endl;
cin >> size_y;
cout << "Enter z: " << endl;
cin >> size_z;
c = new int**[size_x];
for (int i = 0; i < size_x; ++i) {
*(c+i) = new int*[size_y];
for (int j = 0; j < size_y; ++j) {
*(*(c+i)+j) = new int[size_z];
}
}
for (int i = 0; i < size_x; ++i) {
for (int j = 0; j < size_y; ++j) {
for (int k = 0; k < size_z; ++k) {
cout << (*(*(c+i)+j)+k) << endl;
//cout << &c[i][j][k] << endl;
}
}
}
delete [] c;
Когда я ввожу сейчас: 3, 2 и4 я получаю следующий вывод в консоли:
1005 * 0x100100a60 0x100100a64 0x100100a68 0x100100a6c 0x100100a70 0x100100a74 0x100100a78 0x100100a7c 0x100100a90 0x100100a94 0x100100a98 0x100100a9c 0x100100aa0 0x100100aa4 0x100100aa8 0x100100aac 0x100100ac0 0x100100ac4 0x100100ac8 0x100100acc 0x100100ad0 0x100100ad4 0x100100ad8 0x100100adc 1007 * Что мой вопросТеперь, если мы посмотрим на вывод, то увидим, что в основном память выравнивается каждые 4 байта, но иногда мы видим больший шаг, например, от 0x100100a7c до 0x100100a90.
Это нормально и как я могу предотвратить это?Почему это?Есть ли возможность заставить c выровнять мою память как постоянную строку?(Я не родной английский, так что извините за это, но я не знаю, как это лучше сказать)
Это просто для общего понимания: -)
Спасибо тебе!
PS Достаточно ли использовать delete [] один раз или мне нужно пройти через каждый из 3 блоков памяти и удалить [] весь массив?РЕДАКТИРОВАТЬ:
Теперь я удаляю память, и это работает довольно хорошо:
cout << "Free Memory" << endl;
for (int i = 0; i < m_sx; ++i) {
for (int j = 0; j < m_sy; ++j) {
delete [] m_array[i][j];
//delete [] (*(*(m_array)+j)+k);
}
delete [] m_array[i];
}
delete [] m_array, m_array = NULL;