Как узнать размер двумерного указателя?

180
14 мая 2018, 14:10

Не могу найти как узнать размер двумерного указателя. Я передаю указатель arrKeyRate

...
    int row_arr_KeyRate = listRate.count();
        QString **arrKeyRate = new QString* [row_arr_KeyRate];
        int column_arr_KeyRate = 3;
        for (int i=0; i<row_arr_KeyRate;i++) {
            arrKeyRate[i] = new QString[column_arr_KeyRate];
        }
        for(int j=0; j<row_arr_KeyRate;j++) {
            arrKeyRate[j][0]=listDataFrom.at(j);
            arrKeyRate[j][1]=listDataTo.at(j);
            arrKeyRate[j][2]=listRate.at(j);
        }
        emit(dataReadyRead(arrKeyRate));

... Тут пытаюсь узнать его размер так sizeof(arrKeyRate)/sizeof(*arrKeyRate) и так arrKeyRate[j]->count() и так arrKeyRate[j]->size()

...
    void MainWindow::dataUploader(QString **arrKeyRate)
    {
        for(int j=0; j<=sizeof(arrKeyRate)/sizeof(*arrKeyRate);j++){
          qDebug()<<"MainWindow"<<arrKeyRate[j][0]<<arrKeyRate[j][1]<<arrKeyRate[j][2]<<sizeof(arrKeyRate)/sizeof(*arrKeyRate)<<sizeof(arrKeyRate)<<sizeof(*arrKeyRate);
        }
    }
...

Но он выводиться не весь так как размер не правильный.

Answer 1

Размер указателя вы и получаете:

sizeof(arrKeyRate) // должно вернуть 8 для 64-битного компилятора

(это размер QString** указателя).

sizeof(*arrKeyRate) 

(а это размер QString* указателя). Кстати, их размер одинаковый.

Размер массива по указателю вы в c++ никак не получите. И логично же. Даже если взглянуть на "популярную" функцию в c - точку входа в программу - можно обнаружить такую сигнатуру:

int main(int argc, char* argv[])

Первым параметром идет "длина" массива (длина не в байтах, а в "штуках"), вторым - сам массив (кстати, можно вместо char* argv[] писать char** argv, смысл практически не меняется).

Если вам нужно передавать куда-то двухмерный массив, вам необходимо также явно передать и длины его измерений, к примеру:

void MainWindow::dataUploader(int lengthX, int lengthY, QString **arrKeyRate) { ... }

Вы можете заметить, что хранить длину массива отдельно от самого массива - не особо-то удобно. И на помощь приходят вектора:

std::vector<std::vector<QString>> arrKeyRate(row_arr_KeyRate);

Ну и так далее - смысл понятен. Тогда для вектора вы сможете получать длину так:

int lengthX = arrKeyRate.size();
int lengthY = arrKeyRate[0].size();

Кстати, вторая строчка выполнится безопасно лишь в том случае, если в векторе 1 и больше подвекторов, так как мы берем длину первого подвектора. Ну с этим тоже разберетесь, думаю.

Answer 2

Вообше то у вас есть размер массива(вы сначала правильно писали, а размер любого указателья фиксированный) arrKeyRate содержит адрес первого элемента массива из row_arr_KeyRate указателей, которые указывают на массив из int column_arr_KeyRate = 3; элементов. Так что ваш массив имеет размер

 row_arr_KeyRate` * column_arr_KeyRate
READ ALSO
C++ WinAPI обработка исключений [требует правки]

C++ WinAPI обработка исключений [требует правки]

Напишите код для консольного приложения, обрабатывающего исключение при переполнении разрядной сетки

174
Решение ABA - проблемы

Решение ABA - проблемы

Необходимо решить ABA - проблему, используя младшие биты в качестве счетчика

199
Рекурсивный поиск файлов по маске во всех директориях и папках С++

Рекурсивный поиск файлов по маске во всех директориях и папках С++

Короче, проблема в том, что не получается попадать в другие диски и папки(выше чем лежит исполняемый файл)И вообще сильное ощущение, что написана...

204