The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"стоки в C: странное предупреждение"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"стоки в C: странное предупреждение"  
Сообщение от fa email(??) on 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ообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "стоки в C: странное предупреждение"  
Сообщение от vic (??) on 30-Июл-07, 12:10 
>[оверквотинг удален]
>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ообщить модератору

2. "стоки в C: странное предупреждение"  
Сообщение от jd (??) on 30-Июл-07, 12:58 
Вероятно к этому месту в коде, переменные приходят не как '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) всё это скорее всего не актуально, так как он, насколько я знаю, не пытается изменять свои аргументы, несмотря на такой странный прототип :).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "стоки в C: странное предупреждение"  
Сообщение от fa email(??) on 31-Июл-07, 12:07 
Да, так и оказалось. Объявлены как const char*. Огромное спасибо за ответы.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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