Member 13404013 Ответов: 2

Почему я получаю ошибку seg для следующего кода?


Я пытаюсь динамически выделять память на вход argc, но постоянно получаю ошибку seg

Что я уже пробовал:

int main(int argc, char* argv[])
{
  int n = argc;

  char** argv_inputs = malloc(n * sizeof(char*));
  int* array_of_ints = malloc(n * sizeof(int));



  int i, sum, index;

  if (argc < 3)
  {
    printf("Error: too few arguments");
  }
  else
  {
    for(i = 2; i <= n; i++)
    {
      argv_inputs[i-2] = argv[i];
    }

    string_to_int(argv_inputs, array_of_ints, n-1);
    }
  return(0);
}

Mohibur Rashid

Ваш цикл for выполняется лишнюю милю

Jochen Arndt

Вы читали мой ответ на ваш предыдущий вопрос?

Там я уже заметил, что цикл повторяется в неправильном диапазоне.

2 Ответов

Рейтинг:
2

Jerry Jeremiah

argc - это количество локаций в argv
Таким образом, argv имеет местоположения от 0 до argc-1

А затем вы устанавливаете n=argc
Таким образом, argv имеет местоположения от 0 до n-1

Но ваш цикл for говорит for (i = 2; i <= n; i++)
Так что в конце концов он устанавливает i=n
В том случае, когда вы получаете доступ к argv[i]
Вы на самом деле получаете доступ к argv[n]
И это вне массива в памяти, которой вы не владеете.


Рейтинг:
0

Patrice T

Вы можете упростить свой код, вам это не нужно argv_inputs

string_to_int(argv[2], array_of_ints, n-1);

будет работать то же самое без копирования, он тоже рухнет, потому что n-1 это 1 аргумент слишком много.

Вы должны изучить отладчик, он поможет вам самостоятельно найти то, что не так.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.