【问题标题】:How to pass a pointer as an array argument? [closed]如何将指针作为数组参数传递? [关闭]
【发布时间】:2012-12-16 17:07:15
【问题描述】:

我有一个第三方库,函数声明如下:

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

【问题讨论】:

  • 输入的声明呢?
  • 输入与此问题无关。所以我省略了。
  • @xmllmx:我认为你错了。您假设输入与您的问题无关,因为您不了解output 实际上是如何传递给foo 的。然而,output 几乎肯定是问题所在。
  • 顺便问一下,@xmllmx,full 错误消息是什么(参数号、类型),char 是真实代码使用的实际类型吗?
  • @xmllmx: 另外,请记住字符串文字的类型为const char *,而不仅仅是char *(有一个已弃用的隐式转换,但它通常只会给您带来不必要的麻烦)。

标签: c++ c arrays argument-passing function-declaration


【解决方案1】:

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

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

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

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

【讨论】:

  • +1 我同意这个答案,除了要注意标准的细微差别,它实际上将特定的 leading 数组下标标识为退化指针。这对于多下标数组变得很重要。 IE。 foo(char ar[10][20] 退化为 foo(char (*ar)[20])(或 foo(char ar[][20]),如果您愿意)。这允许您将char[2][20] char[10][10] 传递给所述函数。
【解决方案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 的声明。

【讨论】:

  • 忘记删除c... :)
  • @David:...好吧,很公平。当然,下一个人会抱怨我在手动管理内存,并且会在我使用向量之前对我大喊大叫。
  • @EdS.:这正是我在回答中写示例时的恐惧:)
  • 在此过程中,您还忘记了捕捉std::bad_alloc。哎呀! ;)
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2018-05-14
  • 1970-01-01
  • 2021-11-14
  • 2015-01-29
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多