问题描述
我有一个函数的参数为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);
}