Как передать указатель в качестве аргумента массива?

У меня есть сторонняя библиотека, которая имеет следующую функцию:

void foo(const void* input, char output[1024]);

Если я напишу что-то вроде этого:

char* input = "Hello";
char  output[1024];
foo(input, output); // OK

Но я не хочу объявлять такой большой массив в стеке (это было бы очень опасно в среде ядра ОС). Поэтому я должен сделать что-то вроде этого:

char* input      = "Hello";
char* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664

Я не могу изменить реализацию foo. Как я должен сделать?

=================

Проблема была решена. Мой настоящий код выглядит так:

char* input      = "Hello";
void* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664

преобразование из void * в char * не подразумевается стандартом. Так работает следующий код:

char* input      = "Hello";
void* output_buf = new char[1024];
foo(input, (char*)output_buf); // OK

-2

Решение

Проблема не с output, В действительности ваша функция не принимает массив, так как вы не можете передавать массивы в функции. Получает указатель на символ. Это будет работать так же:

void foo(char f[1024])
{
// blah
}

int main() {
char c1[1];
foo(c1);  // works!

char *c2 = new char[27];
foo(c2);  // works!

delete [] c2;
}

Этот код скомпилируется, и это происходит потому, что функция получает указатель, вот и все. Итак, проблема с вашим первым аргументом, input, Это тип должен быть неправильным. Посмотрите на ваше сообщение об ошибке более внимательно и / или покажите нам объявление input,

2

Другие решения

Это странно, поскольку в C ++ любой аргумент функции типа массива фактически считается указателем, т. Е. Сигнатура «реальной» функции, видимая компилятором,

void foo(const void* input, char* output);

После определения типа каждого параметра любой параметр типа «массив из T» […] настраивается на «указатель на T» (C ++ 11, [dcl.fct], ¶5)

Самое главное, ваш код делает работа, как видите Вот; Вы уверены, что ваш «суженный» пример действительно отражает проблему, с которой вы столкнулись? Вероятно, проблема заключается в типе другого параметра.

3

По вопросам рекламы [email protected]