Почему эта программа создает sh, когда динамически размещенный двумерный массив получает входные данные? - PullRequest
0 голосов
/ 24 февраля 2020

Я принимаю данные от пользователя, чтобы продолжить работу с моей программой. Все работает отлично, пока я не попытаюсь ввести строку в двумерный массив cityName. Как только я ввожу строку, программа вылетает.

//dynamically allocate memory for user input (integers)
int *xOfCity = calloc(numOfCities, sizeof(int));
int *yOfCity = calloc(numOfCities, sizeof(int));

//dynamically allocate memory for user input (city names)
char **cityName = (char **) calloc(numOfCities, sizeof(char *));
for (int i = 0; i < numOfCities; i++)
    cityName[i] = (char *) calloc(CITY_NAME + 1, sizeof(char));

int dxOfFront, dyOfFront;

//read in data from user
for (int i = 0; i < numOfCities; i++) {
    scanf("%d", &xOfCity[i]);
    if (xOfCity[i] > MAX_GRAPH || xOfCity[i] < MIN_GRAPH)
        return ERROR;
    scanf("%d", &yOfCity[i]);
    if (yOfCity[i] > MAX_GRAPH || yOfCity[i] < MIN_GRAPH)
        return ERROR;
    for (int j = 0; j < CITY_NAME; j++) 
        scanf("%s", cityName[i][j]);
}

Чтобы быть уверенным, что проблема с 2D-массивом, я закомментировал его и запустил программу, взяв в качестве входных данных только целые числа, и программа работала нормально , Я попытался распределить массив другим способом, но, похоже, это тоже не сработало.

Зачем моей программе выбрасывать sh при вводе строки?

1 Ответ

2 голосов
/ 24 февраля 2020

Здесь важно отслеживать разыменования вашего указателя.

Вы начинаете с символа ** и получаете к нему доступ после его разыменования дважды - то есть двух индексов, i и j. Когда вы обращаетесь к cityName [i] [j], вы не ссылаетесь на символ *, вы фактически передаете значение самого первого символа. Это означает, что ваша программа использует символ в качестве указателя!

Вы бы лучше просто сделали:

scanf("%s",cityName[i]);

J не требуется.

...