Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка сегментирования

12K
04 августа 2006 года
Criolit
20 / / 27.06.2006
Привет всем!
У меня возникла такая проблема. Я написал прогу, скомпилил, а когда запускаю, что выдается следующее сообщение: Ошибка сегментирования. Вот код:
Код:
#include <time.h>
#include <stdio.h>
#include <string.h>

#define INFO_PATH "/root/info/calls.txt"

typedef struct _INFO_ {
    char pWho[30];
    char pDateTime[30];
    char pDirection[30];
} CALL_INFO ;

int main(int argc, char** args)
{
    time_t now;
    time(&now);

    FILE* infoFile = NULL;

    if (strcmp(args[1], "set") == 0) {
        if (strlen(args[2]) == 0)
            printf("User name is missing!");
        else if (strlen(args[3]) == 0)
            printf("Direction argument is missing!");
        else {
            if ((infoFile = fopen(INFO_PATH, "a+")) == NULL) {
                printf("Unable to open info file in %s\n", INFO_PATH);
                return 1;
            }

            CALL_INFO info;
            strcpy(info.pWho, args[2]);
            strcpy(info.pDirection, args[3]);
            strcpy(info.pDateTime, asctime(localtime(&now)));

            fwrite(&info, sizeof(CALL_INFO), 1, infoFile);

            fclose(infoFile);
        }
    }
    else if (strcmp(args[1], "view") == 0) {
        if ((infoFile = fopen(INFO_PATH, "r")) == NULL) {
            printf("Unable to open info file in %s\n", INFO_PATH);
            return 1;
        }

        CALL_INFO info;

        printf("Date\tWho\tCall Direction\n");

        while (!feof(infoFile)) {
            fread(&info, sizeof(CALL_INFO), 1, infoFile);
            printf("%s\t%s\t%s\n", info.pDateTime, info.pWho, info.pDirection);
        }

        fclose(infoFile);
    }
    else
        printf("Use syntax:\n\tto add record: pr set username direction\n\tto view: pr view\n");

    return 0;
}

Я только начал програмить под Unix, так что не судите строго если я где-то дал маху.
Заранее спасибо.
240
04 августа 2006 года
aks
2.5K / / 14.07.2006
Ну не знаю из-за чего случился конкретно тот баг - надо описать поподробние условия возникновения, но вижу что как минумум один стопроцентный баг здесь:
 
Код:
if (strcmp(args[1], "set") == 0) {

Нельзя так делать, ибо неизвестно существует ли вобще args[1]. Параметров командной строки может и не быть и тогда програма сразу упадет при запуске. Всегда надо сначала проверять количество реальных параметров в argc. Это впринципе языка C касаеться а не только програмирования под UNIX системы )
12K
04 августа 2006 года
Criolit
20 / / 27.06.2006
Спасибо за поправку.
Я не указал как я компилирую и запускаю прогу:
компилирование: g++ -o main main.cpp
запуск: ./main
240
04 августа 2006 года
aks
2.5K / / 14.07.2006
Ну собственно тогда понятно - ловится тот баг о котором я говорил.
12K
04 августа 2006 года
Criolit
20 / / 27.06.2006
Все. До меня дошло, что это за ошибка сегментирования. Я просто выполяю обращение к элементу массива, которого нет, если запускаю без параметров этот файл.
Да уж не жучок, а жучище целый :) !
Спасибо aks!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог