首页 > 解决方案 > 如何将 char 数组传递给 char** 参数

问题描述

我有一个有参数的函数,因为char**我需要在同一个参数中传递一个数组值,我怎么能传递它?

int fun(char** val)
{
  std::cout<<"val:"<<*val<<"\n";
}

int main()
{
  char ch[20];
  strlcpy(ch, "test", sizeof(ch));

  fun(&ch[0]) // here how can I pass the char array getting build issue
}

标签: c++

解决方案


我认为最好根据签名弄清楚函数的意图是什么fun,即参数的类型:

fun接受一个指向单个字符或一组字符开头的指针的指针。首先,这意味着fun希望有一个对指针的“引用”。这通常意味着func想要修改这个指针并将这个修改传回给调用者。它接缝val实际上是一个包含指针的输出参数。如果这是您的实际意图,请使用此函数签名!在这种情况下,您可以这样调用fun

char *c = NULL;
fun(&c);
// c is set by fun to a certain value

fun如果您只是想打印出字符,那么对于您的代码的读者来说,将签名更改为更容易和更明显

int fun(char *val) { /* ... */ }

这表示fun需要一个指向单个字符或一堆字符的指针。它将按值获取此指针,对指针本身的任何修改都不会明显超出fun. fun在这种情况下,您将致电

char c[] = "Hello World!";
fun(c);

现在,您为什么会遇到构建问题: is 的类型&ch[0]char *即指向某些字符的指针。但是您所fun期望char **的,即指向某些字符的指针的指针。这显然是个问题。它也与函数签名所表达的意图相矛盾:fun想要对指针进行“引用”以修改这个引用的指针。

编辑:所以,听起来你被一个奇怪的 API 困住了,需要将一个字符数组传递给一个需要char **参数的函数。在这种情况下,其他答案提供了正确的,尽管仍然值得怀疑的解决方案:

char c[] = "Hello World";
char *ptr = &c[0];
fun(&ptr);

ptr指向 的第一个字符c。变量ptr本身有一个地址,即&ptr,其类型为char **&ptr指向您可以传递给的一堆字符的指针所需的“引用”也是如此fun

但请注意,fun可以自由更改 的值ptr,即地址ptr本身指向的地址。有可能,从对 的调用返回fun, 的值ptr是完全不同的,指向一个你没想到的地址。哎呀,即使您从一个永远不会调用的静态内存free(ptr)中的地址开始,也可能希望您在最后调用。要了解这些细节,您必须阅读该功能的详细说明ptrfree()fun


推荐阅读