-2

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

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
4

2 回答 2

3

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

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

在确定每个参数的类型后,将任何类型为“T 数组”[...] 的参数调整为“指向 T 的指针”(C++11,[dcl.fct],¶5)

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

于 2012-12-16T17:13:16.673 回答
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.

于 2012-12-16T17:13:42.097 回答