Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под *nix > C++ на Unix
Перезагрузить страницу Ошибка Segmentation fault
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
extira extira вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.04.2009
По умолчанию 27.04.2009, 16:31

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

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

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

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

Вот кусок кода:
Код:
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();
.............................
Ответить с цитированием
  (#2 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 27.04.2009, 23:10

1. Покажите структуру filerights.
2. fullpath=malloc(path+name+1); - нулевой байт в конце строки
3. Попробуйте запустить программу под valgrind.
Ответить с цитированием
  (#3 (permalink)) Старый
extira extira вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.04.2009
По умолчанию 28.04.2009, 05:31

Цитата:
2. fullpath=malloc(path+name+1); - нулевой байт в конце строки
Спасибо, да я сама уже это нашла, было еще несколько похожих ошибок с выделением памяти меньше чем действительно нужно + ошибки с копированием указателей, пришлось копировать не указатели а области памяти.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при прожиге дисков - "ошибка драйвера DMA. ошибка CRC". burn Техническая поддержка 6 24.01.2012 19:51
General Protection Fault написал мне ноут lelik229 Ремонт ноутбуков 5 24.05.2011 09:51
Ошибка: Generic Host Process For Win 32 Services-обнаружена ошибка СЕлНик Техническая поддержка 4 13.03.2009 17:07
При подключении к интернету выдается ошибка: svchost.exe Ошибка приложения. evgenich512 Любые вопросы от новичков 3 13.12.2008 23:26
Segmentation fault в CGI бинарное компилирование Vladimir the Red Sunny Общие вопросы программирования 2 07.08.2008 18:06
Как исправить ошибку scanf segmentation fault Leon C++ на Unix 9 27.09.2007 11:52
Как передать структуру по сети или Segmentation fault vain С/С++ 6 19.01.2006 00:20
При директиве PUT - ошибка 75 ошибка обращения к файлу/пути cowboy Visual Basic 4 17.11.2005 18:51
Что это такое page fault in non page(d) area Northwood Железо. Написание драйверов 4 28.03.2005 20:31
Проблемы из-за указателя *temp segmentation fault tariavo millach C++ на Unix 2 03.01.2005 01:29
Как узнать что ошибка программы или же ошибка в программном коде Vasis Delphi 0 01.07.2004 16:09
Apache выдает "segmentation fault" XKiller PHP 0 15.02.2003 15:22



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов