Я могу создать двумерный массив в C++ следующим образом. Но мне трудно понять адреса памяти.адрес в динамическом двумерном массиве в C++
(Пожалуйста, обратите внимание на последнюю строку моего кода, где я пытаюсь напечатать десятичные значения ячеек памяти.)
#include <cstdio>
#include <iostream>
using namespace std;
#define rowSize 3
#define colSize 4
int main(){
int ** p;
p = new int*[rowSize];
for(int i = 0; i < rowSize; i++){
p[i]= new int[colSize];
}
printf("the size of int**: %d\n", sizeof(int**));
printf("the size of int*: %d\n", sizeof(int*));
printf("the size of int: %d\n\n", sizeof(int));
printf("%d %d", p[0], p[1]);
return 0;
}
Я использовал GCC версии 4.7.1 (ТДМ-1) компилятор и побежал мой программа на моем Windows 10-бит бит.
Вот пример вывода:
размер междунар **: 4
размер междунар *: 4
размер междунар: 4
Итак, вот мои два вопроса:
Почему адреса отличаются на 24 вместо 16 (= 4 * 4)? Размер int равен 4 и есть 4 столбца в строке. Разве они не должны отличаться на 16? Я знаю про байтовое дополнение в структуре в C++. Что-то в этом причина этого?
Я попытался изменить colSize 5:
#define colSize 5
и перекомпилировать и снова запустили программу.Выход образца:
the size of int**: 4 the size of int*: 4 the size of int: 4 7151960 7151992
На этот раз адреса отличаются 32. Если байт обивка была причина, в 5 колонок потребует 5 * 4 = 20 байт. В этом случае достаточно заполнить 4 байта, и в этом случае адреса должны отличаться на 24.
Так почему же в этом случае они отличаются друг от друга на 32?
Какой ответ (ы) вы ожидаете? Объяснение деталей реализации gcc? Или «Как вопрос будет сформулирован, это те детали, которые не гарантированы, вы не должны делать прогнозы о них, но если вам нужно полагаться на X и Y, используйте это ...» достаточно? – VolkerK
Попробуйте то же самое с реальным 2d массивом: int p [3] [4]; –
Да, тогда их разность может быть рассчитана. Но меня больше интересовало понимание того, возвращает ли 'new int [colSize]' адрес в некотором шаблоне. –