указатели, rtt, 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 ведь тоже не константа |
- указатели, rtt, 01:48 , 12-Июл-06 (1)
С последним вопросом разобрался - там нужно просто в цикле выделять память для каждого указателя и соответсвенно в цикле ее освобождать
- указатели, phpcoder, 06:52 , 12-Июл-06 (2)
>Если же все-таки n - не константа то нужно использовать malloc >char *ch=malloc(5); >А как быть с char *name[argc+1]?argc ведь тоже не константа В смысле, ты не знаешь как массив динамически создать? man calloc По коду: а где необходимые #include ? Ну и *(argv+i) читается труднее нежели argv[i] -- в итоге я не стал сильно вникать в твою програму.
- указатели, rtt, 13:37 , 12-Июл-06 (3)
>>Если же все-таки n - не константа то нужно использовать malloc >>char *ch=malloc(5); >>А как быть с char *name[argc+1]?argc ведь тоже не константа > >В смысле, ты не знаешь как массив динамически создать? man calloc >Не с этим я разобрался, там в цикле нужно выделять память >По коду: а где необходимые #include ? ну это понятно я их опустил чтоб место сэкономить > Ну и *(argv+i) читается труднее >нежели argv[i] -- в итоге я не стал сильно вникать в >твою програму. Так вот, тут на форуме говорят что нельзя к указателям вообще применять [] хотя прога и тоже так компилится и работает, и в книжках умных я тоже частенько такую запись видел.Получается это просто стиль программирования?
И еще один вопрос по идее записи char (*name)[5] и char *name[5] идентичны, но с первым у меня прога не компилится.Почему?
- указатели, phpcoder, 14:30 , 12-Июл-06 (4)
>Получается это просто стиль программирования? Да. Массивы по сути и есть указатели, только запись со скобками боле понятна что ли. >И еще один вопрос >по идее записи >char (*name)[5] >и >char *name[5] > идентичны, но с первым у меня прога не компилится.Почему? Потому что они не идентичны. В во втором случае вы определяете массив указателей, а в первом -- не соображу что будет, но что-то другое %)) Вообщем, читай Керниган и Ритчи -- у них там объяснялось.
- указатели, Forth, 15:00 , 12-Июл-06 (5)
>>по идее записи >>char (*name)[5] >>и >>char *name[5] >> идентичны, но с первым у меня прога не компилится.Почему? > >Потому что они не идентичны. В во втором случае вы определяете массив >указателей, а в первом -- не соображу что будет, но что-то >другое %)) По-моему в обоих случаях будет одно и то же - указатель на массив символов.
- указатели, frenzy, 09:25 , 16-Июл-06 (6)
>>>по идее записи >>>char (*name)[5] >>>и >>>char *name[5] >>> идентичны, но с первым у меня прога не компилится.Почему? >> >>Потому что они не идентичны. В во втором случае вы определяете массив >>указателей, а в первом -- не соображу что будет, но что-то >>другое %)) >По-моему в обоих случаях будет одно и то же - указатель на >массив символов. char *name[5] - массив из 5 указателей на char char (*name)[5] - указатель на массив из пяти элементов имеющих тип char
- указатели, MKuznetsov, 13:59 , 16-Июл-06 (7)
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);
|