The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
стоки в C: странное предупреждение, !*! fa, 30-Июл-07, 11:49  [смотреть все]
Всем привет. Я начинающий в С. Может кто подскажет, в чем разница
char *arg1 и char *arg2 объявлены в .h файле

Если пытаюсь ими инициализировать массив строк, получаю warning
char* chld_args[] = {arg1,arg2,NULL};
execvp(prog,chld_args);
warning: initialization discards qualifiers from pointer target type

Если дублирую и инициализирую созданными дублями warining-а нет
char* local_arg1 = strdup(arg1);
char* local_arg2 = strdup(arg2);
char* chld_args[] = {local_arg1,local_arg2,NULL};
execvp(prog,chld_args);

Подскажите, что это за предупреждение, чем опасно, что делаю не так.
Заранее спасибо

  • стоки в C: странное предупреждение, !*! vic, 12:10 , 30-Июл-07 (1)
    >[оверквотинг удален]
    >warning: initialization discards qualifiers from pointer target type
    >
    >Если дублирую и инициализирую созданными дублями warining-а нет
    >char* local_arg1 = strdup(arg1);
    >char* local_arg2 = strdup(arg2);
    >char* chld_args[] = {local_arg1,local_arg2,NULL};
    >execvp(prog,chld_args);
    >
    >Подскажите, что это за предупреждение, чем опасно, что делаю не так.
    >Заранее спасибо

    Как именно инициализируются в .h ?

  • стоки в C: странное предупреждение, !*! jd, 12:58 , 30-Июл-07 (2)
    Вероятно к этому месту в коде, переменные приходят не как 'char *', а, например, как 'const char *' - вы привели неполный кусок, точнее не скажешь. Если, например, arg1 и arg2 - глобальные переменные, объявленные в заголовочном файле (как можно понять из ваших слов, но это слишком дико, чтобы быть правдой), то такой ошибки быть не должно.

    Компилятор же говорит чёрным по белому, что такая инициализация отбрасывает квалификаторы у строк, на которые указывают arg1 и arg2. Как правило это именно присвоение переменной типа 'type *' значения типа 'const type *'.

    Чем это опасно (в общем случае), думаю, и так понятно: потенциальной попыткой перезаписать константу. В результате: от изменения переменной там, где она меняться не должна, до Segmentation fault в случае, если сегмент памяти, в котором находится то, куда указывает указатель, является read-only.

    Хотя в вашем случае, скорее всего ничего такого не произойдёт, так как после exec(3) никаких старых переменных уже не останется ***, а сами функции exec(3), по-моему, содержимое своих аргументов не меняют.

    *** Надо помнить, что при провале exec(3) программа будет выполняться дальше. И даже если вы вставите сразу после exec(3) вызов exit(3) (что, вероятно, необходимо сделать), то перед выходом у вас могут быть вызваны функции, установленные, например, с помощью atexit(3). Хотя, повторяю, в случае с exec(3) всё это скорее всего не актуально, так как он, насколько я знаю, не пытается изменять свои аргументы, несмотря на такой странный прототип :).




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру