C++ 如何将指针作为数组参数传递?

C++ 如何将指针作为数组参数传递?,c++,c,arrays,argument-passing,function-declaration,C++,C,Arrays,Argument Passing,Function Declaration,我有一个第三方库,其功能如下: 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 C2

我有一个第三方库,其功能如下:

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
char* input      = "Hello";
void* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664
但我不想在堆栈上声明这么大的数组(这在操作系统内核环境中是非常危险的)。所以我必须这样做:

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
char* input      = "Hello";
void* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664
我不能改变foo的实现。我该怎么办

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

问题已经解决了。我的真实代码如下所示:

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
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

这很奇怪,因为在C++中,数组类型的任何函数参数实际上都被认为是指针类型,即编译器所看到的“实际”函数签名是

void foo(const void* input, char* output);
在确定每个参数的类型后,将任何类型为“数组的T”[…]的参数调整为“指向T的指针”(C++11,[dcl.fct],^5)


最重要的是,正如您所看到的,您的代码确实有效;您确定您的“缩小”示例实际上反映了您所看到的问题吗?问题可能在于另一个参数的类型。

问题不在于
输出。实际上,函数不接受数组,因为不能将数组传递给函数。它接收指向char的指针。这也会起作用:

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的声明

input的声明如何?input与此问题无关。所以我省略了它。@xmlmx:我认为你错了。您假设输入与您的问题无关,因为您不了解
输出
实际上是如何传递给
foo
的。然而,
output
几乎肯定是问题所在。顺便问一下,@xmllmx,完整的错误消息(参数编号、类型)是什么,以及
char
是实际代码使用的实际类型吗?@xmllmx:另外,请记住字符串文字的类型是
const char*
,而不仅仅是
char*
(有一个不推荐使用的隐式转换,但它通常只会给您带来不必要的麻烦。)忘记删除
c
…)@David:…好的,很公平。当然,下一个人会抱怨我在手动管理内存,并会对我大喊大叫,直到我使用向量。@EdS:这正是我在回答中编写示例时所担心的:)同时,你也忘了捕捉
std::bad_alloc
。哎呀!;)+1我同意这个答案,只是注意到标准的细微差别,它实际上将特定的前导数组下标标识为退化指针。这对于多下标数组非常重要。也就是说,
foo(char-ar[10][20]
退化为
foo(char(*ar)[20])
(或者
foo(char-ar[][20])
,如果您愿意的话)。这允许您向所述函数传递
char[2][20]
,而不是
char 10][10]