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

Я пытаюсь создать двумерный массив на С++, используя метод двойного указателя. Но когда я инициализирую переменную, я всегда получаю, что массив имеет размер 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