为什么动态分配的2D数组接收输入时此程序崩溃?

问题描述 投票:0回答:1

我正在接受用户的输入以继续我的程序。一切运行良好,直到我尝试将字符串输入2D数组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数组是问题,我将其注释掉并仅以整数作为输入来运行该程序,并且该程序运行良好。我尝试以另一种方式分配数组,但这似乎也不起作用。

为什么输入字符串后我的程序会崩溃?

c multidimensional-array dynamic-memory-allocation
1个回答
0
投票

这里重要的是要跟踪指针的取消引用。

您以char **开头,然后在对它进行两次解引用之后访问它-即两个索引i和j。当您访问cityName [i] [j]时,您未引用char *,实际上是在传递第一个字符本身的值。这意味着您的程序正在使用字符作为指针!

您最好干脆做:

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

不需要j。

© www.soinside.com 2019 - 2024. All rights reserved.