2014-01-21 3 views
-1

Я немного не знаком с моим программированием на С, и я уверен, что это что-то простое, что я собираюсь ударить себя на потом, но я не могу понять это. Я не хочу, чтобы получить возможность отправлять слишком много коды, но вот то, что релевантно:C Сегментация Fault structs/pointers

#define MAX_COMMAND_ARGS 9 
#define MAX_COMMAND_SIZE 80 

typedef struct 
{ 
    int argc; 
    char* argv[MAX_COMMAND_ARGS + 1]; 
    char* history[MAX_COMMAND_SIZE+1]; 
    size_t size; 

} Command; 



void History(const Command* cmd) 
{ 
    for (size_t i = 0; i < cmd->size-1; ++i) 
    { 
     printf("%s\n", cmd->history[i]); 
    } 
} 

И эта линия, которая существует внутри другой функции, как вводятся команды:

command->history[command->size] = command->argv[0]; 
++(*command).size; 

Я пытаюсь реализовать простая команда истории, но каждый раз, когда я вызываю функцию History, я получаю seg-ошибку. Любая помощь будет оценена по достоинству.

Редактировать: я исправил проблему с форматом, я возился с линией printf. Это линия, где я получаю ошибку сегм:

printf("%s\n", cmd->history[i]); 
+1

Ну, вы не говорите нам, какая строка бросает исключение, и не показывает какой-либо код, который вызывает History(). У вас, скорее всего, есть нулевой указатель или переполнение буфера. Вот почему существуют отладчики. Положите, как использовать его. Это будет ваш лучший друг. Кроме того, вы пытаетесь напечатать две строки в вашем printf и имеете только один параметр. Может быть, проблема. – OldProgrammer

+0

скомпилируйте ваше программное обеспечение с помощью '-Wall' и прочитайте предупреждения. –

+0

Вы получаете ошибку seg на первой итерации? –

ответ

0

Сегментация Диагностика, как правило, попытка доступа к памяти, что процессор не может физически решения.

Avoid using uninitialized pointer. 

выделить память с помощью таНос() или calloc() и назначить его к указателю, а затем присвоить значения его.

0

Весьма вероятно, что вы не выделяете память для таблицы истории.

Попробуйте вставить записи истории с помощью функции strdup и не забудьте позвонить free после удаления записи из списка.

Если это не ваша проблема, вам нужно предоставить нам больше кода.