对于擅长C的人来说,铸造类型很容易

时间:2009-02-19 10:41:45

标签: c pointers casting

我有一个库,我必须将(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中的内容是什么? (到目前为止,我所有的都是内存地址)

感谢您的帮助

4 个答案:

答案 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试图做什么。