如何将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
}

解决方法

我认为最好根据签名(即参数的类型)确定函数fun的意图是什么

fun将指针指向单个字符或一串字符的开头。首先,这意味着fun希望有一个指向指针的“引用”。这通常意味着func要修改此指针并将此修改传递回调用者。它接缝val实际上是一个包含指针的out参数。如果这是您的实际意图,请使用此功能签名!在这种情况下,您可以通过以下方式致电fun

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

如果您只想打印出字符,那么代码阅读者将fun的签名更改为

会更容易,也更明显。
int fun(char *val) { /* ... */ }

这表示fun使用指向单个字符或一堆字符的指针。它将按值获取此指针,对指针本身的任何修改都不会在fun之外。在这种情况下,您将通过{p>致电fun

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

现在,为什么会出现构建问题:&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)中的某个地址开始到某个静态内存,也可能永远都希望最后调用ptr,而永远不要调用free()要了解这些详细信息,您必须阅读功能fun的详细说明。

,

ch是一个char[]数组。 &ch[0]正在解引用数组以访问第一个元素,产生一个char,然后获取该char的地址,产生一个char*。但是该函数需要一个char**来代替。因此,将char*保存到变量中,然后将该变量的地址传递给函数,例如:

int main()
{
    char ch[20];
    strlcpy(ch,"test",sizeof(ch));
    char *ptr = ch; // same as: ptr = &ch[0] 
    fun(&ptr);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...