【问题标题】:Why does this program crash when a dynamically allocated 2D array receive input?当动态分配的二维数组接收输入时,为什么这个程序会崩溃?
【发布时间】:2020-06-07 17:00:00
【问题描述】:

我正在接受用户的输入以继续我的程序。在我尝试将字符串输入到二维数组 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]);
}

为了确保二维数组是问题,我将其注释掉并运行程序,只将整数作为输入,并且程序运行良好。我尝试以不同的方式分配数组,但这似乎也不起作用。

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

【问题讨论】:

  • cityName[i][j]char%s 需要 char*。你的编译器应该警告你,所以如果没有,你应该看看如何在你的编译器上启用警告。 (另外,scanf("%s") 很难正确使用;考虑一下fgets。)
  • 不用这么乱,只需使用struct city { int x; int y; char name[CITY_NAME + 1]; },您就没有任何这些问题

标签: c multidimensional-array dynamic-memory-allocation


【解决方案1】:

在此跟踪您的指针取消引用很重要。

您从 char** 开始,并在取消引用它两次后访问它 - 即两个索引 i 和 j。当您访问 cityName[i][j] 时,您并没有引用 char*,您实际上是在传递第一个字符本身的值。这意味着您的程序正在使用字符作为指针!

你最好简单地做:

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

j 不是必须的。

【讨论】:

  • scanf() 周围的循环也是不必要的。另一种选择(但可能不太理想)是使用scanf("%c", &amp;cityName[i][j]); 准确读取城市名称的最大字符数。要求用户自己计算字符是令人讨厌的。但是%s 不会在城市名称中包含空格——例如,没有机会输入“纽约”或“旧金山”。
猜你喜欢
  • 1970-01-01
  • 2015-01-28
  • 2021-08-06
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多