Ошибка 'segmentation Fault'

Тема в разделе "Общие вопросы по С и С++", создана пользователем extira, 27 апр 2009.

  1. extira

    extira Гость

    При работе программы вылетает ошибка Segmentation fault

    Если в switch идти по варианту 'd' вылетает в промежутке между printf("TEST4\n") и printf("TREST"). TEST4 выводит а TREST уже нет.
    Если в switch идти по варианту 'f' то вылетает сразуже даже не печатая test10.

    Я даже не знаю в какую сторону копать.

    ЗЫ. Закоменчено конечноже все это не было.

    Вот кусок кода:
    [codebox]int main (int argc, char *argv[])
    {
    if(argc!=3||((argv[1][0]!='d'||argv[1][0]!='f')&& argv[1][1]!=0))
    {
    printf("The program %s takes 2 arguments:\n\t 1 - \"d\" - make matrix of all included elements in directory\n\t\t\"f\" - make matrix of element n\t 2 - full path to element\n", argv[0]);
    return 0;
    }

    struct stat info;
    struct filerights *fileinfo=NULL;
    int ret;
    DIR *directory=NULL;
    struct dirent *entry=NULL;
    struct dirent *entry1=NULL;
    int i=0, j=0;
    size_t path, name;
    char *fullpath=NULL;
    int ii=0;
    struct passwd **users;
    int k=0, l=0;

    switch (argv[1][0])
    {
    case 'd':
    directory=opendir(argv[2]);
    if(directory==NULL)
    {
    perror("ERROR:");
    return 0;
    }
    while (entry = readdir(directory))
    {
    if(entry == NULL)
    {
    perror("ERROR1:");
    }
    else
    {
    i=i+1;
    }
    }
    if(closedir(directory)==(-1))
    {
    perror("ERROR");
    }
    fileinfo=malloc(i*sizeof(struct filerights));
    if(fileinfo==NULL)
    {
    perror("ERROR:");
    }
    directory=opendir(argv[2]);
    if(directory==NULL)
    {
    perror("ERROR:");
    }
    path=strlen(argv[2]);
    // printf("%d\n",i);
    for(j=0;j<i;j++)
    {
    // printf("%d\n",j);
    entry1=readdir(directory);
    if(entry1==NULL)
    {
    perror("ERROR");
    printf("End");
    return 0;
    }
    else
    {
    // printf("working %d\n", j);
    }
    // printf("%s\n", entry1->d_name);
    name=strlen(entry1->d_name);
    fullpath=malloc(path+name);
    if(fullpath==NULL)
    {
    perror("ERROR");
    }
    if(strcpy(fullpath,argv[2])==NULL)
    {
    perror("ERROR");
    }
    if(strcat(fullpath,entry1->d_name)==NULL)
    {
    perror("ERROR");
    }
    // printf("%s\n", fullpath);

    if(!stat(fullpath, &info))
    {
    // printf("testI");
    if(strcpy(fileinfo[j].name, fullpath)==NULL)
    {
    perror("ERROR");
    }
    // printf("%s\n", fileinfo[j].name);
    fileinfo[j].uid=info.st_uid;
    fileinfo[j].gid=info.st_gid;

    if((info.st_mode|1)==info.st_mode)
    {
    fileinfo[j].execute_other=1;
    }
    else
    {
    fileinfo[j].execute_other=0;
    }
    if((info.st_mode|2)==info.st_mode)
    {
    fileinfo[j].write_other=1;
    }
    else
    {
    fileinfo[j].write_other=0;
    }
    if((info.st_mode|4)==info.st_mode)
    {
    fileinfo[j].read_other=1;
    }
    else
    {
    fileinfo[j].read_other=0;
    }
    if((info.st_mode|8)==info.st_mode)
    {
    fileinfo[j].execute_group=1;
    }
    else
    {
    fileinfo[j].execute_group=0;
    }
    if((info.st_mode|16)==info.st_mode)
    {
    fileinfo[j].write_group=1;
    }
    else
    {
    fileinfo[j].write_group=0;
    }
    if((info.st_mode|32)==info.st_mode)
    {
    fileinfo[j].read_group=1;
    }
    else
    {
    fileinfo[j].read_group=0;
    }
    if((info.st_mode|64)==info.st_mode)
    {
    fileinfo[j].execute_owner=1;
    }
    else
    {
    fileinfo[j].execute_owner=0;
    }
    if((info.st_mode|128)==info.st_mode)
    {
    fileinfo[j].write_owner=1;
    }
    else
    {
    fileinfo[j].write_owner=0;
    }
    if((info.st_mode|256)==info.st_mode)
    {
    fileinfo[j].read_owner=1;
    }
    else
    {
    fileinfo[j].read_owner=0;
    }
    if((info.st_mode|512)==info.st_mode)
    {
    fileinfo[j].sticky_bit=1;
    }
    else
    {
    fileinfo[j].sticky_bit=0;
    }
    if((info.st_mode|1024)==info.st_mode)
    {
    fileinfo[j].set_gid=1;
    }
    else
    {
    fileinfo[j].set_gid=0;
    }
    if((info.st_mode|2048)==info.st_mode)
    {
    fileinfo[j].set_uid=1;
    }
    else
    {
    fileinfo[j].set_uid=0;
    }
    }
    else
    {
    perror("ERROR:");
    return 0;
    }
    free(fullpath);
    }
    // printf("TEST\n");
    closedir(directory);
    // free(fullpath);
    // printf("TEST1\n");
    // printf("TEST2\n");
    // printf("TEST3\n");
    // printf("TEST4\n");
    break;
    case 'f':
    // printf("test10");
    i=1;
    // printf("test1");
    fileinfo=malloc((size_t)sizeof(struct filerights));
    // printf("test2");
    if(!stat(argv[2], &info))
    {
    strcpy(fileinfo->name, argv[2]);
    fileinfo->uid=info.st_uid;
    fileinfo->gid=info.st_gid;

    if((info.st_mode|1)==info.st_mode)
    {
    fileinfo->execute_other=1;
    }
    else
    {
    fileinfo->execute_other=0;
    }
    if((info.st_mode|2)==info.st_mode)
    {
    fileinfo->write_other=1;
    }
    else
    {
    fileinfo->write_other=0;
    }
    if((info.st_mode|4)==info.st_mode)
    {
    fileinfo->read_other=1;
    }
    else
    {
    fileinfo->read_other=0;
    }
    if((info.st_mode|8)==info.st_mode)
    {
    fileinfo->execute_group=1;
    }
    else
    {
    fileinfo->execute_group=0;
    }
    if((info.st_mode|16)==info.st_mode)
    {
    fileinfo->write_group=1;
    }
    else
    {
    fileinfo->write_group=0;
    }
    if((info.st_mode|32)==info.st_mode)
    {
    fileinfo->read_group=1;
    }
    else
    {
    fileinfo->read_group=0;
    }
    if((info.st_mode|64)==info.st_mode)
    {
    fileinfo->execute_owner=1;
    }
    else
    {
    fileinfo->execute_owner=0;
    }
    if((info.st_mode|128)==info.st_mode)
    {
    fileinfo->write_owner=1;
    }
    else
    {
    fileinfo->write_owner=0;
    }
    if((info.st_mode|256)==info.st_mode)
    {
    fileinfo->read_owner=1;
    }
    else
    {
    fileinfo->read_owner=0;
    }
    if((info.st_mode|512)==info.st_mode)
    {
    fileinfo->sticky_bit=1;
    }
    else
    {
    fileinfo->sticky_bit=0;
    }
    if((info.st_mode|1024)==info.st_mode)
    {
    fileinfo->set_gid=1;
    }
    else
    {
    fileinfo->set_gid=0;
    }
    if((info.st_mode|2048)==info.st_mode)
    {
    fileinfo->set_uid=1;
    }
    else
    {
    fileinfo->set_uid=0;
    }
    }
    else
    {
    perror("ERROR:");
    return 0;
    }
    break;
    }
    // printf("TREST");

    // printf("test3");

    setpwent();
    .............................[/codebox]
     
Загрузка...

Поделиться этой страницей