我正在接受用户的输入以继续我的程序。一切运行良好,直到我尝试将字符串输入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数组是问题,我将其注释掉并仅以整数作为输入来运行该程序,并且该程序运行良好。我尝试以另一种方式分配数组,但这似乎也不起作用。
为什么输入字符串后我的程序会崩溃?
这里重要的是要跟踪指针的取消引用。
您以char **开头,然后在对它进行两次解引用之后访问它-即两个索引i和j。当您访问cityName [i] [j]时,您未引用char *,实际上是在传递第一个字符本身的值。这意味着您的程序正在使用字符作为指针!
您最好干脆做:
scanf("%s",cityName[i]);
不需要j。