Инициализиране на C++ масиви с указатели, получаване на размер 8

Опитвам се да създам двуизмерен масив в C++, използвайки метода на двойния указател. Но когато инициализирам променливата, винаги получавам, че масивът е с размер 8. Първо опитах това:

  double** sobel_x;

И получих размер 8 и след това, когато опитах това:

  double** sobel_x;
  sobel_x = new int*[3];
  for(int i = 0; i < sizeof(sobel_x); i++) {
    sobel_x[i] = new int[3];
  }

Може ли някой да ми обясни първо защо масивът е инициализиран до размер 8 и второ как да променя този размер?


person azrosen92    schedule 05.10.2013    source източник
comment
Как проверявате размера? Вероятно виждате размера на указателя, а не размера на масива - който сте изхвърлили, като сте съхранили само указател.   -  person Daniel Frey    schedule 05.10.2013
comment
@P0W благодаря! Дори не забелязах, че го направих   -  person azrosen92    schedule 05.10.2013


Отговори (2)


Този код:

double** sobel_x = new int*[3];
std::cout << sizeof(sobel_x);

винаги ще отпечата sizeof указателя, защото sizeof се оценява по време на компилиране (на базата на типа, който е double** в този случай), независимо какво сте присвоили на този указател в време на изпълнение.

Използвайте std::vector вместо това:

std::vector< std::vector<double> > sobel_x(3, std::vector<double>(3, 0.0));
std::cout << sobel_x.size();

Имайте предвид, че дори и да можете да извлечете размера, той ще бъде в байтове. Няма да ви даде броя на елементите. За да постигнете това с масиви, можете да използвате статичен масив с продължителност на автоматично съхранение:

double sobel_x[3][3] = { 0.0 };
std::cout << sizeof(sobel_x);                         // <-- outputs 72
std::cout << sizeof(sobel_x[0]);                      // <-- outputs 24
std::cout << sizeof(sobel_x) / sizeof(sobel_x[0]);    // <-- outputs 3
person LihO    schedule 05.10.2013
comment
Има ли някакъв начин да направите това с масиви? - person azrosen92; 05.10.2013
comment
@azrosen92: Вижте отговора ми сега :) - person LihO; 05.10.2013
comment
хм добре, предполагам, че това ме води до втория ми проблем тогава, опитвам се да използвам този масив в друга функция, която написах, че съм проектирал да приема произволен размер на масива като вход. И открих в C++, че не можете да декларирате функция void FunctionName(double[][] array) трябва да използвате void FunctionName(double** array). И така, има ли някакъв начин да се направи масив, който да работи в FunctionName? - person azrosen92; 05.10.2013

Извиквате sizeof на sobel_x, а sobel_x е указател. Това означава, че 8 е размерът на указател на вашата система (вероятно 64-битова машина).

Тази публикация обяснява, че не можете да правите това, което искате:C++: получаване на размера на реда на многомерен масив, предаден на функция

Ако трябва да изчислите дължината по време на изпълнение, използвайте един от STL класовете като вектор.

Въпреки че за вашия прост случай на употреба, вие вече знаете колко елемента има в масива, към който сочи sobel_x (3 в този случай), така че просто използвайте това като тестово условие във вашия цикъл.

person ksimons    schedule 05.10.2013