如何将char数组传递给char**参数

  • 本文关键字:char 参数 数组 c++
  • 更新时间 :
  • 英文 :


我有一个函数的参数为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取一个指向单个字符或一组字符开头的指针的指针。首先,这意味着CCD_;参考";指向指针。这通常意味着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之外可见。在这种情况下,您将通过呼叫fun

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

现在,为什么会出现构建问题:&ch[0]的类型是char *,即指向某些字符的指针。但是您的fun需要char **,即指向某些字符的指针。这显然是个问题。它也与函数签名所表达的意图相矛盾:CCD_;参考";以修改此引用的指针。

编辑:因此,听起来您陷入了一个奇怪的API,需要将一个字符数组传递到一个需要char **参数的函数中。在这种情况下,其他答案提供了正确的解决方案,尽管仍然有问题:

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

CCD_ 18指向CCD_ 19的第一个字符。变量ptr本身具有一个地址,即&ptr,其类型为char **。因此CCD_;参考";指向可以传递给fun的一组字符的指针。

但请注意,fun可以自由更改ptr的值,即ptr本身指向的地址。从对fun的调用返回时,ptr的值可能完全不同,指向的是一个您没有想到的地址。见鬼,甚至有可能在最后调用free(ptr),即使您从ptr中的一个地址开始到某个静态内存,您永远不会调用free()。要了解这些详细信息,您必须阅读函数fun的详细规范

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

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

最新更新