Кастинг, простой вопрос для людей, хороших в C - PullRequest
0 голосов
/ 19 февраля 2009

У меня есть библиотека, которую я должен передать (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 ]

4 голосов
/ 19 февраля 2009

Документы для hci_scan должны точно сказать, что из этого выйдет, но я предполагаю, что это будет строка с памятью, выделенной из hci_scan. Вам действительно не нужно определять return_string как массив; char *return_string; должно работать так же хорошо.

3 голосов
/ 19 февраля 2009

Если hci_scan изменяет значение, переданное ему, поскольку использование (char **), по-видимому, подразумевает, тогда ваш код недопустим, так как вы не можете изменять адрес массива , Я подозреваю, что hci_scan хочет выделить память, поэтому вы хотите что-то вроде:

char * buf;
hci_scan( & buf );   // allocates string & points buff to it

но вам действительно нужно прочитать документацию hci_scan, чтобы убедиться.

1 голос
/ 19 февраля 2009

Нельзя приводить 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;

что совсем не то, что программист хочет сделать.

0 голосов
/ 19 февраля 2009
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 пытается сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...