尝试分配新内存时,为什么重新分配会使我的程序崩溃?

时间:2018-11-15 09:05:53

标签: c function realloc

我的realloc函数有一些问题。 我有结构国家,内部有结构“城市”,其中包括指向城市的数组,每个城市有3个场:

typedef struct Country {
    char *name;
    int numberOfCities;
    City* cities;
    cordinate cordinateOfCountryLeft;
    cordinate cordinateOfCountryRight;
}Country;

typedef struct City
{
    char *name;
    char * popluarFood;
    int numberOfPeople;

}City;

我需要从“城市”数组中删除城市,以便使用我构建的名为freeCity的功能释放城市:

void freeCity(City *pCity)
{
    free(pCity->name);
    free(pCity->popluarFood);
    free(pCity);
}

但是在delelte之后,当我尝试重新分配时,在重新分配时出现此函数错误

status freeCityFromCountry(Country *country, char *cityName)
{
    for (int i = 0; i < country->numberOfCities; i++) {//for
        if (strcmp(country->cities[i].name, cityName)==0)
        {
           freeCity(country->cities+i);
            country->cities[i] = country->cities[country->numberOfCities - 1];
          //  free(country->cities[country->numberOfCities - 1]);
            country->cities = (City*)realloc(country->cities,(country->numberOfCities-1));
            country->numberOfCities--;
            return success;
        }
    }//for
    return failure;
}

我在其他功能中分配国家->城市。 问题出在哪里? 谢谢

2 个答案:

答案 0 :(得分:3)

您不能在指向已分配块中间的指针上调用freecountry->cities指向内存中的一个连续块(N x sizeof(City))。一个好的经验法则是,如果您有malloc(something),则必须在其他地方(free(something)-> {{1 }}。

代码崩溃是因为第一次调用malloc(country->cities)释放了free(country->cities)。也许您希望freeCity是一个指针数组,即country->cities,在这种情况下,您将分别分配每个.cities,然后City**数组将指向块您可以单独释放。

答案 1 :(得分:0)

假设您在另一个函数中分配了<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input type='text' id="someId" value="test Value ">

您正在呼叫country->cities

但是在freeCity(country->cities+i);功能中,您还可以释放城市freeCity

因此,对于free(pCity);数组,您可以在cities上免费拨打电话。这有两个问题

  1. 对于第一个循环,当city[i]i时,您要释放数组,然后重新分配它。
  2. 对于其他迭代,当0不为零时,您将释放错误的位置。您应该释放数组的底部而不是数组内部。