c++ - 如何将 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
实际上是一个包含指针的输出参数。如果这是您的实际意图,请使用此函数签名!在这种情况下,您可以这样调用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)
中的地址开始,也可能希望您在最后调用。要了解这些细节,您必须阅读该功能的详细说明。ptr
free()
fun
推荐阅读
- gcloud - How do I configure an ip address for my binance trading bot deployed on google cloud?
- python - Regarding about subprocess .Popen
- cakephp - How to conciliate TinyMCE FileUpload and CakePHP
- azure-active-directory - 使用密码重置用户流令牌的 Azure B2C 已过期,无法登录到应用程序主页
- angular - 类型 'HTMLElement' 不可分配给类型 'string | 模板参考
' 当尝试使用 ngx-popover 的 HTML 模板时 - r - Constrained shuffling of rows based on columns
- c - 是否有用于圆形功能的 ARM Neon 指令?
- c++ - How to properly calling a signal when using epoll_pwait()?
- python - create one-hot encoding for multi-labels
- c# - 使用 LiveCharts 在折线图中绘制垂直线