Указатель на указатели не совпадает с указателем на массивы.
![very crude diagram](https://i.stack.imgur.com/QRCJu.png)
(В частности, обратите внимание, как sizeof(*ptr1)
равно sizeof(char)*6
, тогда как sizeof(*ptr3)
равно sizeof(char*)
& ndash; это имеет серьезные последствия для арифметики указателей.)
new char[5][10]
дает вам char (*)[10]
(что, кстати, не имеет абсолютно никакого отношения к указателям на функции), потому что указатели и символы расположены таким образом в памяти (мой второй пример).
Это , а не то же самое, что char**
(что представляет собой разную компоновку), поэтому преобразование между ними не имеет смысла; следовательно, это запрещено.
Таким образом, тип возврата вашей функции должен быть char (*)[10]
:
char (*f())[10] {
char (*v)[10] = new char[5][10];
return v;
}
Конечно, это действительно ужасно, так что вам гораздо лучше с std::vector<std::string>
.
Эта запись часто задаваемых вопросов объясняет это лучше всего под заголовком "Конверсии".