Приведение из const char arr [] в char ** - PullRequest
1 голос
/ 20 июня 2020

Итак, у меня следующая ситуация:

void func(char ** a)
{
// Do some stuff...
}

int main() 
{
    const char * arr[2] = { "foo" };
    arr[1] = "bar";

    // I want to Cast the arr from const char ** to char **
    func(arr);
}

Я думаю, func(reinterpret_cast<char**>(arr)); - это способ, но я не знаю, лучший ли это способ.

Спасибо!

1 Ответ

3 голосов
/ 20 июня 2020

Во-первых, это объявление

const char * arr[2] = "foo";

неверно. Массивы являются агрегатами, и инициализаторы их элементов должны быть заключены в фигурные скобки.

const char * arr[2] = { "foo" };

Используемый в выражениях массив (за редкими исключениями) преобразуется в указатель типа const char **.

Эта функция

void func(char ** a)
{
// Do some stuff...
}

не принимает указатель на указатель на постоянные данные. Это означает, что функция может изменять указанные данные. Это, в свою очередь, означает, что вы не должны передавать свой массив этой функции.

Что вы могли бы сделать, так это динамически выделить массив массивов, например,

char **p = new char *[2];

for ( size_t i = 0; i < 2; i++ )
{
    p[i] = new char[4];
}

strcpy( p[0], "foo" );
strcpy( p[1], "bar" );

func( p );

for ( size_t i = 0; i < 2; i++ )
{
    delete[] p[i];
}

delete[] p;
...