Привет всем!
Если кого не затруднит - проверьте плз прогу.Я просто тренируюсь работать с указателями и был бы рад если бы кто-нибудь указал бы на ошибки
Суть этой проги в том что она парсит список аргументов командной строки и если найдет требуемый, то исключает этот ключ и вызывает другую прогу, передавая ей тот же список аргументов но без 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 ведь тоже не константа
С последним вопросом разобрался - там нужно просто в цикле выделять память для каждого указателя и соответсвенно в цикле ее освобождать
>Если же все-таки n - не константа то нужно использовать malloc
>char *ch=malloc(5);
>А как быть с char *name[argc+1]?argc ведь тоже не константаВ смысле, ты не знаешь как массив динамически создать? man calloc
По коду: а где необходимые #include ? Ну и *(argv+i) читается труднее нежели argv[i] -- в итоге я не стал сильно вникать в твою програму.
>>Если же все-таки n - не константа то нужно использовать malloc
>>char *ch=malloc(5);
>>А как быть с char *name[argc+1]?argc ведь тоже не константа
>
>В смысле, ты не знаешь как массив динамически создать? man calloc
>Не с этим я разобрался, там в цикле нужно выделять память
>По коду: а где необходимые #include ?
ну это понятно я их опустил чтоб место сэкономить
> Ну и *(argv+i) читается труднее
>нежели argv[i] -- в итоге я не стал сильно вникать в
>твою програму.
Так вот, тут на форуме говорят что нельзя к указателям вообще применять []
хотя прога и тоже так компилится и работает, и в книжках умных я тоже частенько такую запись видел.Получается это просто стиль программирования?И еще один вопрос
по идее записи
char (*name)[5]
и
char *name[5]
идентичны, но с первым у меня прога не компилится.Почему?
>Получается это просто стиль программирования?Да. Массивы по сути и есть указатели, только запись со скобками боле понятна что ли.
>И еще один вопрос
>по идее записи
>char (*name)[5]
>и
>char *name[5]
> идентичны, но с первым у меня прога не компилится.Почему?Потому что они не идентичны. В во втором случае вы определяете массив указателей, а в первом -- не соображу что будет, но что-то другое %))
Вообщем, читай Керниган и Ритчи -- у них там объяснялось.
>>по идее записи
>>char (*name)[5]
>>и
>>char *name[5]
>> идентичны, но с первым у меня прога не компилится.Почему?
>
>Потому что они не идентичны. В во втором случае вы определяете массив
>указателей, а в первом -- не соображу что будет, но что-то
>другое %))
По-моему в обоих случаях будет одно и то же - указатель на массив символов.
>>>по идее записи
>>>char (*name)[5]
>>>и
>>>char *name[5]
>>> идентичны, но с первым у меня прога не компилится.Почему?
>>
>>Потому что они не идентичны. В во втором случае вы определяете массив
>>указателей, а в первом -- не соображу что будет, но что-то
>>другое %))
>По-моему в обоих случаях будет одно и то же - указатель на
>массив символов.char *name[5] - массив из 5 указателей на char
char (*name)[5] - указатель на массив из пяти элементов имеющих тип char
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);