Почему я получаю ошибку «Ошибка сегментации» при попытке запустить тесты?

Я написал функцию, которая определяет, следует ли присваивать значения по умолчанию (присваивает значения по умолчанию, если флаг отсутствует, и присваивает значения, которые пользователь передает, если флаг присутствует). И я пытаюсь проверить свою функцию с помощью строки, чтобы узнать, дали ли она правильные номера. Я продолжаю получать «Ошибка сегментации», когда я пытаюсь запустить тесты, он компилируется, но тесты просто не работают. 🙁

Вот мой заголовочный файл:

#ifndef COMMANDLINE_H #define COMMANDLINE_H #include "data.h" #include  struct point eye; /* The variable listed above is a global variable */ void eye_flag(int arg_list, char *array[]); #endif 

Вот мой файл реализации:

 #include  #include "commandline.h" #include "data.h" #include "string.h" /* Used global variables for struct point eye */ void eye_flag(int arg_list, char *array[]) { eye.x = 0.0; eye.y = 0.0; eye.z = -14.0; /* The values listed above for struct point eye are the default values. */ for (int i = 0; i <= arg_list; i++) { if (strcmp(array[i], "-eye") == 0) { sscanf(array[i+1], "%lf", &eye.x); sscanf(array[i+2], "%lf", &eye.y); sscanf(array[i+3], "%lf", &eye.z); } } } 

И вот мои тестовые примеры:

 #include "commandline.h" #include "checkit.h" #include  void eye_tests(void) { char *arg_eye[6] = {"a.out", "sphere.in.txt", "-eye", "2.4", "3.5", "6.7"}; eye_flag(6, arg_eye); checkit_double(eye.x, 2.4); checkit_double(eye.y, 3.5); checkit_double(eye.z, 6.7); char *arg_eye2[2] = {"a.out", "sphere.in.txt"}; eye_flag(2, arg_eye2); checkit_double(eye.x, 0.0); checkit_double(eye.y, 0.0); checkit_double(eye.z, -14.0); } int main() { eye_tests(); return 0; } 

Ошибки здесь:

  for (int i = 0; i <= arg_list; i++) { ///^^ if (strcmp(array[i], "-eye") == 0) { sscanf(array[i+1], "%lf", &eye.x); //^^^ sscanf(array[i+2], "%lf", &eye.y); sscanf(array[i+3], "%lf", &eye.z); } } 
  1. i <= arg_list , так как вы проходите в 6, индекс массива начинается с 0, максимальное значение равно 5
  2. i+1, i+2,i+3 выдаст вам индекс за пределы, когда вы перейдете от 0 до 5.

Самый простой способ решить эту проблему – запустить его в отладчике. Вам, вероятно, даже не нужно будет узнать, как пройти через свой код или что-то еще – просто запустите, запустите и прочитайте строку.

Если вы находитесь в системе * nix:

  1. Скомпилируйте свой код с флагом -g .
  2. Загружайте, например, gdb a.out .
  3. Запустите теперь, когда он загружен – (gdb) run .
  4. Сделайте все, что вам нужно, чтобы воспроизвести segfault.
  5. bt или where должна указываться трассировка стека – и точная строка, вызывающая вашу проблему.

Я уверен, что вы можете решить это оттуда, чтобы опубликовать это как ответ; но если нет, зная точную линию, она будет намного легче исследовать и решать.

Условие вашего цикла неверно. Он должен быть i < arg_list .
Подумайте, что произойдет, когда i == arg_list .