The OpenNET Project / Index page

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

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

"указатели"  
Сообщение от rtt on 12-Июл-06, 01:37 
Привет всем!
Если кого не затруднит - проверьте плз прогу.Я просто тренируюсь работать с указателями и был бы рад если бы кто-нибудь указал бы на ошибки
Суть этой проги в том что она парсит список аргументов командной строки и если найдет требуемый, то исключает этот ключ и вызывает другую прогу, передавая ей тот же список аргументов но без MAGIC_KEY
#include

#define MAGIC_KEY "-ff"

int main(int argc,char **argv) {
char *name[argc+1];
int pos=0,i,temp=0,r;

for(i=0;i<argc;i++) {
r=strncmp(*(argv+i),MAGIC_KEY,3);
if(r!=0 && temp==0) {

*(name+i)=*(argv+i);

} else if(r!=0 && temp==1)
{ *(name+i-1)=*(argv+i);}

else{

pos=i;

*(name+i)=*(argv+i+1);
i++;
temp=1;

  }
}


if(pos==0) {

syslog(LOG_ERR, "Called without magic key!");
}
*(name+argc)=NULL;
*name="/usr/sbin/modinfo";

execve(*name,name,NULL);


return 0;

}


То есть прога то работает, но вдруг есть какие-то недочеты
Да и еще
По идее стандарт языка требует чтобы в объявлении массива указывалась константа
то бишь нельзя писать так:
int n=5;
char ch[n];
Нужно писать вот так:
const int n=5;
char ch[n];

Если же все-таки n - не константа то нужно использовать malloc
char *ch=malloc(5);
А как быть с char *name[argc+1]?argc ведь тоже не константа

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

 Оглавление

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


1. "указатели"  
Сообщение от rtt on 12-Июл-06, 01:48 

С последним вопросом разобрался - там нужно просто в цикле выделять память для каждого указателя и соответсвенно в цикле ее освобождать

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

2. "указатели"  
Сообщение от phpcoder email(??) on 12-Июл-06, 06:52 
>Если же все-таки n - не константа то нужно использовать malloc
>char *ch=malloc(5);
>А как быть с char *name[argc+1]?argc ведь тоже не константа

В смысле, ты не знаешь как массив динамически создать? man calloc

По коду: а где необходимые #include ? Ну и *(argv+i) читается труднее нежели argv[i] -- в итоге я не стал сильно вникать в твою програму.


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

3. "указатели"  
Сообщение от rtt on 12-Июл-06, 13:37 
>>Если же все-таки n - не константа то нужно использовать malloc
>>char *ch=malloc(5);
>>А как быть с char *name[argc+1]?argc ведь тоже не константа
>
>В смысле, ты не знаешь как массив динамически создать? man calloc
>

Не с этим я разобрался, там в цикле нужно выделять память
>По коду: а где необходимые #include ?
ну это понятно я их опустил чтоб место сэкономить
> Ну и *(argv+i) читается труднее
>нежели argv[i] -- в итоге я не стал сильно вникать в
>твою програму.


Так вот, тут на форуме говорят что нельзя к указателям вообще применять []
хотя прога и тоже так компилится и работает, и в книжках умных я тоже частенько такую запись видел.Получается это просто стиль программирования?

И еще один вопрос
по идее записи
char (*name)[5]
и
char *name[5]
идентичны, но с первым у меня прога не компилится.Почему?

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

4. "указатели"  
Сообщение от phpcoder email(??) on 12-Июл-06, 14:30 
>Получается это просто стиль программирования?

Да. Массивы по сути и есть указатели, только запись со скобками боле понятна что ли.

>И еще один вопрос
>по идее записи
>char (*name)[5]

>char *name[5]
> идентичны, но с первым у меня прога не компилится.Почему?

Потому что они не идентичны. В во втором случае вы определяете массив указателей, а в первом -- не соображу что будет, но что-то другое %))

Вообщем, читай Керниган и Ритчи -- у них там объяснялось.


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

5. "указатели"  
Сообщение от Forth (??) on 12-Июл-06, 15:00 
>>по идее записи
>>char (*name)[5]
>>и
>>char *name[5]
>> идентичны, но с первым у меня прога не компилится.Почему?
>
>Потому что они не идентичны. В во втором случае вы определяете массив
>указателей, а в первом -- не соображу что будет, но что-то
>другое %))
По-моему в обоих случаях будет одно и то же - указатель на массив символов.

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

6. "указатели"  
Сообщение от frenzy (??) on 16-Июл-06, 09:25 
>>>по идее записи
>>>char (*name)[5]
>>>и
>>>char *name[5]
>>> идентичны, но с первым у меня прога не компилится.Почему?
>>
>>Потому что они не идентичны. В во втором случае вы определяете массив
>>указателей, а в первом -- не соображу что будет, но что-то
>>другое %))
>По-моему в обоих случаях будет одно и то же - указатель на
>массив символов.

char *name[5] - массив из 5 указателей на char
char (*name)[5] - указатель на массив из пяти элементов имеющих тип char

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

7. "указатели"  
Сообщение от MKuznetsov (??) on 16-Июл-06, 13:59 
for(i=1;i<argc;i++)
if (strcmp(argv[i],MAGIC_KEY)==0) {
  argc--;
  memmove(argv+i,argv+i+1,(argc-i)*sizeof(char*));
}
argv[0]="/usr/sbin/modinfo";
argv[argc]=NULL;
execve(argv[0],argv,NULL);
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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




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

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