The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
указатели, !*! 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);



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

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