我有一个库,我必须将(char **)& return_string传递给函数hci_scan 如摘录中所示:
char return_string[250];
int num_hosts;
if ((num_hosts = hci_scan((char **) & return_string, 0x03)) > 0) {
//case where one or more devices are found...
} else {
//case where zero devices are found...
}
执行此操作后,return_string中的内容是什么? (到目前为止,我所有的都是内存地址)
感谢您的帮助
答案 0 :(得分:4)
hci_scan
的文档应该告诉你究竟会发生什么,但我的猜测是它将是一个字符串,其内存是从hci_scan
内分配的。你真的不需要将return_string
定义为数组; char *return_string;
应该也能正常运作。
答案 1 :(得分:3)
如果hci_scan 修改传递给它的值,因为使用(char **)似乎意味着,那么您的代码是非法的,因为您不允许更改地址阵列。我怀疑hci_scan想要分配内存,所以你想要这样的东西:
char * buf;
hci_scan( & buf ); // allocates string & points buff to it
但你真的需要阅读hci_scan文档以确保。
答案 2 :(得分:1)
将char (*) []
投射到char **
是错误的。考虑以下代码:
char foo[42];
assert((void *)foo == (void *)&foo); // this will pass!
&foo
的类型为char (*) [42]
,并引用数组的内存位置,该位置与(char *)foo
和&foo[0]
指向的位置相同!
这意味着
char ** p = (char **)&foo;
与
相同char ** p = (char **)foo;
这通常不是程序员想要做的。
答案 3 :(得分:0)
char return_string[250];
int num_hosts;
if ((num_hosts = hci_scan((char **) & return_string, 0x03)) > 0) {
//case where one or more devices are found...
} else {
//case where zero devices are found...
}
嗯,hci_scan()的签名是什么?我的意思是它返回了什么?即使你没有访问hci_scan()定义,你仍然会有签名,假设它是第三方api的一部分。
看起来hci_scan()需要一个指向指针的指针,以便它可以分配自己的内存并返回指针。如果确实如此,你可以做到
char * return_string; /* No memory allocation for string */
int num_hosts;
if ((num_hosts = hci_scan(&return_string, 0x03)) > 0) { /* get back pointer to allocated memory */
//case where one or more devices are found...
} else {
//case where zero devices are found...
}
但话又取决于hci_scan试图做什么。