URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5565
[ Назад ]

Исходное сообщение
"указатели"

Отправлено 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 , 12-Июл-06 01:48 

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


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

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

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



"указатели"
Отправлено rtt , 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]
идентичны, но с первым у меня прога не компилится.Почему?


"указатели"
Отправлено phpcoder , 12-Июл-06 14:30 
>Получается это просто стиль программирования?

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

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

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

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

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



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


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

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


"указатели"
Отправлено MKuznetsov , 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);