为什么realloc()和free()在我的代码中失败?

时间:2014-09-16 11:49:33

标签: c null free sizeof realloc

realloc()我遇到了一些问题:

int main(int argc, char* argv[])
{
    int* amis;
    int saisie, cpt = 1;

    while(saisie != -1) {
        printf("Entrer les notes -1 pour quitter :");
        scanf("%d", &saisie);
        if (cpt == 1) {
            amis = malloc(sizeof(int));
            if(amis == NULL) {
                printf("amis == NULL");
                exit(0);
            }
        }
        if(saisie != -1) {
           amis = realloc(amis, sizeof (int) + sizeof (amis));
           if(amis == NULL) {
                printf("amis == NULL       cpt= %d", cpt);
                exit(0);
            }
           amis[cpt] = saisie;
           printf("size = %d, saisie = %d, tab = %d \n", cpt * sizeof(int), saisie, amis[cpt]);
           cpt++;
        }
    }
    printf("%d",1==0);

    afficherTab(amis,cpt);
    printf("END\n");

    free(amis);
    return 0;
}

使用realloc()代替sizeof(int) * cpt时,为什么sizeof(amis) + sizeof(int)会导致错误?

free(amis)在这种情况下也不起作用。

1 个答案:

答案 0 :(得分:2)

您遇到的最大问题是您似乎将指针与数组混淆。如果您使用数组,那么:

int foo[10];
printf("%zu\n", sizeof foo/ sizeof *foo);//sizeof foo/sizeof(int)

会给你数组的长度,但指针不是数组。 As I've explained here

  

指针 不是 数组 ,所以它不需要知道数组的大小是。指针可以指向单个值,因此指针可以存在而不存在数组。它甚至不关心它指向的内存所处的位置(只读,堆栈或堆栈......并不重要)。指针的长度不是自身的长度。指针就是......

所以sizeof amis将始终是相同的值:内存地址的大小(32位为4位,64位为8位)。要解决这个问题,您必须自己跟踪已分配块的大小:

size_t amis_size = 0;//use this

scanf(" %d",&saisie);//note the space before %d
amis_size += saisie;
amis = realloc(amis, sizeof *amis * amis_size);

等等。
您应该做的其他事情是:初始化变量:

int *amis = NULL,
    saisie = 0;

修正scanf的格式,并检查saisie的值是否为-1 以外的负值 ...

最后但并非最不重要:exit(0);表示您终止执行,退出状态为0. 0表示流程终止且没有错误,而malloc或{{1} } 错误,请使用reallocstdlib,或使用非零值退出。

在main函数返回之前调用指针上的exit( EXIT_FAILURE );是一件相当无意义的事情,但调用free是一个很好的习惯,所以你可以把它留在那里。
但是,请尝试习惯将free分配给您释放的任何指针:

NULL