Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用malloc创建int*并在满时使用realloc_C_Pointers_Malloc_Dynamic Memory Allocation_Realloc - Fatal编程技术网

使用malloc创建int*并在满时使用realloc

使用malloc创建int*并在满时使用realloc,c,pointers,malloc,dynamic-memory-allocation,realloc,C,Pointers,Malloc,Dynamic Memory Allocation,Realloc,在我创建的函数中,我试图动态分配一个int数组来存储一些索引值。 首先,我使用malloc函数创建int*,然后让循环在其中存储som值,并每次递增指针。 当我试图使用realloc增加内存分配时,我遇到的问题就开始了。 当我这样做的时候,VS告诉我它运行在未定义的行为中并破坏程序 代码如下所示 void showAvailable(CabinHolder *holder, Booking *booking) { system("cls"); printf("Choose ca

在我创建的函数中,我试图动态分配一个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");
}
void showAvailable(出租人*持有人,预订*预订)
{
系统(“cls”);
printf(“选择座舱号”);
printf(“开始周:&d\t结束周:%d”,预订->租期[0],预订->租期[1]);
printf(“------------------------------------------------\n”);
int内存=5;
int*indexOfCabin=(int*)malloc(sizeof(int)*内存);
int计数器=1;
对于(int i=0;i座舱->座舱类型==持有人->座舱类型[i]
{
printf(“%d.\t编号为%d的舱室\t成本:%d每周\n”,计数器,支架->arrofCabin[i]。nr,支架->arrofCabin[i]。成本);
计数器++;
indexOfCabin=&i;
indexOfCabin++;
}
}
免费(indexOfCabin);
系统(“暂停”);
}
当我在VS中调试时,我还发现我的指针indexOfCabin似乎在if语句中没有定义,我不明白这一点。
我错过了什么?

好的,在注释部分提供了一些帮助之后,我解决了这个编辑代码段的问题

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");
}
void showAvailable(出租人*持有人,预订*预订)
{
系统(“cls”);
printf(“选择座舱号”);
printf(“开始周:%d\t结束周:%d\n”,预订->租期[0],预订->租期[1]);
printf(“------------------------------------------------\n”);
int内存=5;
int*indexOfCabin=malloc(sizeof(int)*内存);
int计数器=1;
整数项=0;
int-choice=0;
对于(int i=0;i座舱->座舱类型==持有人->座舱类型[i]
{
printf(“%d.\t编号为%d的舱室\t成本:%d每周\n”,计数器,支架->arrofCabin[i]。nr,支架->arrofCabin[i]。成本);
计数器++;
indexOfCabin[items++]=i;
}
}
免费(indexOfCabin);
系统(“暂停”);
}
第一:问题是indexOfCabin=&我丢弃了您分配的内存,并将i的地址放入指针中,而不是我想要做的事情。现在我们将索引存储在指针的i中


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

看看这个问题:@user3386109实际上realloc会在需要时释放旧内存:@anderssinho请阅读realloc的文档。语句不正确
indexOfCabin
可以像数组一样使用,例如
indexOfCabin[counter]=i。但是
计数器
需要从0开始,并且在使用后应该递增。和
indexOfCabin
不应递增。@user3386109 ah ofc。我会试试看,如果有什么问题,我会回来的。感谢您不应该
realloc
指针本身(例如
indexOfCabin=realloc(indexOfCabin,
),您应该使用临时指针
void*tmp=realloc(indexOfCabin,
),然后检查
if(tmp)
在分配
indexOfCabin=tmp;
之前验证重新分配。否则,如果
realloc
失败,您将使用
NULL
覆盖原始指针地址,导致内存泄漏。@DavidC.Rankin这完全正确,将更改代码中的地址,这也意味着延迟
内存*=2;
直到您验证之后idate
realloc
成功,因此您的
realloc
将看起来像
void*tmp=realloc(indexOfCabin,(内存*2*sizeof*indexOfCabin));if(!tmp){/*handle error*/break;};indexOfCabin=tmp;memory*=2;
@DavidC.Rankin感谢您的解决方案!并理解您提出此建议的原因。它现在已在我的代码中实现。也将使用更改更新此帖子