LINUX.ORG.RU

[gcc][libconfig] указатель на указатель

 


0

0

Компилирую такой кусок кода:

#include <libconfig.h>

int main() {
/* skipped */

char *interface;
if ( !config_setting_lookup_string(setting, "interface", &interface) )
   fprintf(stderr,"init: can't find interface\n");

}

и получаю ворнинг такого содержания:

test.c:62: warning: passing argument 3 of ‘config_setting_lookup_string’ from incompatible pointer type

в libconfig.h говорят, что

extern LIBCONFIG_API int config_setting_lookup_string( const config_setting_t *setting, const char *name, const char **value);

ЧЯДНТ?


Ответ на: комментарий от xorik

Хм.. вроде бы функции частенько объявляются с аргументами const, но при этом нет ругани компилятора. Это ведь всего лишь означает, что в теле функци гарантированно не произойдет изменения данных по указателю.

void foo(const char *str)
{
	printf("%s\n",str);
}

int main()
{
char *str = "Hello, LOR";
foo(str);
}

в примере все собирается без ошибок. В чем тогда нюанс?

Corey
() автор топика
Ответ на: комментарий от Corey

>Это ведь всего лишь означает, что в теле функци гарантированно не произойдет изменения данных по указателю.

Кроме инициализации, как я понимаю?

Corey
() автор топика
Ответ на: комментарий от Sphinx

>Пример не иллюстрирует исходную проблему.

Вот я как раз это и пытаюсь понять. В чем различие?

const char **value гарантирует то, что указатель на массив char *value всегда будет указывать на одну и ту же область памяти?

Corey
() автор топика
Ответ на: комментарий от Corey

Нагуглил про константные указатели и указатели на константу.

Ну да. Поскольку в функции из libconfig происходит выделение памяти и эта библиотека потом сама ее освобождает, ей необходимо удостовериться, что я не смогу изменить память по этому указателю. Но все же не совсем ясно, как происходит проверка компилятором и почему он выдает ворнинг.

Corey
() автор топика
Ответ на: комментарий от Corey

Нет. const char ** означает, что вы будете иметь указатель на строку, которую вы изменить не сможете.

bk_ ★★
()
Ответ на: комментарий от Corey

Когда вы пишите const char **, то изменять возвращенную строку не сможете.

Когда же пишите char **, то компилятор разрешит изменение, что не согласовано с функцией.

Посему он требует написать const.

bk_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.