Я могу создать двумерный массив на 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 (tdm-1) и запускал свою программу на моем 10-64-битном компьютере с Windows.
Вот пример вывода:
размер int **: 4
размер int *: 4
размер int: 4
8135000 8135024
Итак, вот два моих вопроса:
Почему адреса отличаются на 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?
new int[colSize]
адрес в каком-то шаблоне. - person Ahsan Tarique   schedule 28.04.2016