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

时间:2012-12-16 17:07:16

标签: 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

但我不想在堆栈上声明这么大的数组(在OS内核环境中会非常危险)。所以我必须做这样的事情:

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 个答案:

答案 0 :(得分:3)

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

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

确定每个参数的类型后,任何类型为“T of T”的参数都被调整为“指向T的指针”(C ++ 11,[dcl.fct],¶5)< / p>

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

答案 1 :(得分:2)

问题不在于output。实际上,您的函数不会采用数组,因为您无法将数组传递给函数。它接收一个指向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的声明。