【问题标题】:Creating a int * with malloc and then use realloc when full使用 malloc 创建一个 int *,然后在满时使用 realloc
【发布时间】:2018-07-24 17:24:22
【问题描述】:

在我创建的函数中,我是否尝试动态分配一个 int 数组来存储一些索引值。 首先,我使用 malloc 函数创建 int *,然后让循环在其中存储 som 值并每次递增指针。 当我尝试使用 realloc 来增加内存分配时,我遇到的问题就开始了。 当我这样做时,VS 告诉我它会遇到未定义的行为并破坏程序。

代码如下所示

void showAvailable(CabinHolder *holder, Booking *booking)
{
    system("cls");

    printf("Choose cabin number \n");
    printf("Start week: &d \t End week: %d", booking->rentPeriod[0], booking->rentPeriod[1]);
    printf("------------------------------------------\n");

    int memory = 5;
    int *indexOfCabin = (int *)malloc(sizeof(int)*memory);
    int counter = 1;

    for (int i = 0; i < CABINS; i++)
    {
        if (counter == memory)
        {
            memory *= 2;
            int *expanded = realloc(indexOfCabin, (memory * sizeof(int)));
            indexOfCabin = expanded;
            expanded = NULL;
        }

        if (booking->cabin->typeOfCabin == holder->arrofCabin[i].typeOfCabin)
        {
            printf("%d. \t Cabin with number %d \t cost: %d per week\n", counter, holder->arrofCabin[i].nr, holder->arrofCabin[i].cost);
            counter++;
            indexOfCabin = &i;
            indexOfCabin++;
        }
    }

    free(indexOfCabin);
    system("pause");
}

当我在 VS 中调试时,我还发现我的指针 indexOfCabin 在 if 语句中似乎没有定义,我不明白。 我在这里错过了什么?

【问题讨论】:

  • 看看这个问题:stackoverflow.com/q/605845/812912
  • @user3386109 实际上 realloc 会在需要时负责释放旧内存:en.cppreference.com/w/c/memory/realloc
  • @anderssinho 请阅读 realloc 的文档。该说法不正确
  • indexOfCabin 可以像数组一样使用,例如indexOfCabin[counter] = i;。但是counter需要从0开始,使用后应该递增。并且indexOfCabin 不应该增加。
  • @user3386109 啊 ofc。如果有任何问题,我会尝试并复出。谢谢

标签: c pointers malloc dynamic-memory-allocation realloc


【解决方案1】:

好的,在评论部分得到一些帮助后,我解决了这个编辑过的代码段的问题。

void showAvailable(CabinHolder *holder, Booking *booking)
{
    system("cls");

    printf("Choose cabin number \n");
    printf("Start week: %d \t End week: %d\n", booking->rentPeriod[0], booking->rentPeriod[1]);
    printf("------------------------------------------\n");

    int memory = 5;
    int *indexOfCabin = malloc(sizeof(int)*memory);
    int counter = 1;
    int items = 0;
    int choice = 0;

    for (int i = 0; i < CABINS; i++)
    {
        if (counter-1 == memory)
        {
            memory *= 2;
            indexOfCabin = realloc(indexOfCabin, (memory * sizeof(int)));
        }

        if (booking->cabin->typeOfCabin == holder->arrofCabin[i].typeOfCabin)
        {
            printf("%d. \t Cabin with number %d \t cost: %d per week\n", counter, holder->arrofCabin[i].nr, holder->arrofCabin[i].cost);
            counter++;
            indexOfCabin[items++] = i;
        }
    }
    free(indexOfCabin);
    system("pause");
}

首先:问题是 indexOfCabin = &i 丢弃了您分配的内存,并将 i 的地址放入指针中,而不是我想做的事情。现在我们将 i 中的索引存储在指针中。

第二:indexOfCabin 可以像数组一样使用,例如indexOfCabin [计数器] = i;。但是 counter 需要从 0 开始,使用后应该递增。并且 indexOfCabin 不应该增加

【讨论】:

  • 你应该永远 realloc指针本身(例如indexOfCabin = realloc(indexOfCabin,...,你应该使用一个临时指针void *tmp = realloc(indexOfCabin,...,然后检查if (tmp)来验证重新分配之前分配indexOfCabin=tmp;。否则,如果realloc 失败,您将使用NULL 覆盖您的原始指针地址,从而导致内存泄漏。
  • @DavidC.Rankin 完全正确,将在代码中进行更改
  • 这也意味着延迟memory *= 2;直到你验证realloc成功之后,所以你的realloc看起来像void *tmp = realloc (indexOfCabin, (memory * 2 * sizeof *indexOfCabin)); if (!tmp) {/* handle error */ break; }; indexOfCabin = tmp; memory *= 2;
  • @DavidC.Rankin 感谢解决方案!并理解你为什么提出这个建议。它现在已在我的代码中实现。也将通过更改更新此帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多