realloc():C中的下一个大小无效[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了realloc():C中的下一个大小无效[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

新年快乐!

我一直在努力寻找导致错误的原因,我将在下面解释一段时间,我会非常感谢任何帮助。我有以下代码,原则上应该实现一个堆栈:

#include <stdio.h>
#include <stdlib.h>

void resize(int *nmax, int *d){
    int i, *u;
    *nmax *= 2;
    u = (int *)realloc(d,sizeof(int)*(*nmax));
    if(u == NULL){
        printf("Error!\n");
        exit(1);
    }
    d = u;
}

void push(int *n, int *d, int *nmax){
    int u = *n , i;
    if(u == *nmax) {
        resize(nmax, d);
    }
    *(d + u) = u;
    u++;
    *n = u;
}

void pop(int *n){
    int u = *n;
    *n = u - 1;
}

int main(){
    int *d, n = 0, i, nmax = 5;
    d = (int *)malloc(sizeof(int)*nmax);
    *(d+(n))= n;
    n++;
    *(d+(n)) = n;
    n++;
    *(d+(n)) = n;
    n++;
    //for(i = 0;i < n;i++)
        //printf("%d\n",*(d+i));
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    push(&n,d, &nmax);
    //pop(&n);
    //pop(&n);
    //pop(&n);
    for(i = 0;i<n;i++)
        printf("%d\n",*(d+i));

    return 0;
}

它似乎行为正常,直到我在推送操作堆栈之前取消注释printf语句。我得到的错误是:

0
1
2
*** Error in `./a.out': realloc(): invalid next size: 0x0000000000f08010 ***

我不确定我已经解释好了,如果我没有,请告诉我我可以添加的任何其他细节,以便更清楚。

非常感谢您的帮助!

编辑:

希望代码现在变得更具可读性,这就是我所拥有的:

#include <stdio.h>
#include <stdlib.h>

void resize(int *sizeOfArray, int *myArray){
    int i, *u;
    *sizeOfArray *= 2;
    u = (int *)realloc(myArray,sizeof(int)*(*sizeOfArray));
    if(u == NULL){
        printf("Error!\n");
        exit(1);
    }
    myArray = u;
}

void push(int *pos, int *myArray, int *sizeOfArray){
    int i;
    if(*pos == *sizeOfArray) {
        resize(sizeOfArray, myArray);
    }
    *(myArray + (*pos)) = *pos;
    (*pos)++;
}

void pop(int *pos){
    (*pos)--;
}

int main(){
    int *myArray, pos = 0, i, sizeOfArray = 5;
    myArray = (int *)malloc(sizeof(int)*sizeOfArray);
    *(myArray + pos)= pos;
    pos++;
    *(myArray + pos) = pos;
    pos++;
    *(myArray + pos) = pos;
    pos++;
    //for(i = 0;i < pos;i++)
        //printf("%d\n",*(myArray+i));
    push(&pos, myArray, &sizeOfArray);
    push(&pos, myArray, &sizeOfArray);
    push(&pos, myArray, &sizeOfArray);
    push(&pos, myArray, &sizeOfArray);
    //pop(&pos);
    //pop(&pos);
    //pop(&pos);
    for(i = 0;i<pos;i++)
        printf("** %d\n",*(myArray+i));

    return 0;
}

现在,错误已经改变 - 这可能表明该方法存在问题 - 它的内容如下:

我应该得到:

** 0
** 1
** 2
** 3
** 4
** 5
** 6

相反,我得到:

** 0
** 0
** 2
** 3
** 4
** 5
** 6

为什么?当我在中间取消评论printf时,我才会得到这个。

谢谢您的帮助。

答案

int *myArray是函数的语言环境,语句myArray = u;只会更改语言环境值,而不是调用函数的值。

您必须使用双指针或返回值。

int *resize(int *sizeOfArray, int *myArray){
    *sizeOfArray *= 2;
    int *u = realloc(myArray, *sizeOfArray * sizeof *myArray);
    if (u == NULL) {
        printf("Error!\n");
        exit(1);
    }
    return u;
}

myArray = resize(sizeOfArray, myArray);

当然,你也必须在你的push()中改变这种行为。

以上是关于realloc():C中的下一个大小无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章

free():fclose 上的下一个大小(正常)无效。但不是在 Valgrind 运行时[重复]

free():无效的下一个大小(快)字符串太长了? [重复]

realloc 使用详解(分析realloc invalid pointer指针无效等错误)

Realloc 无效指针。中止(核心转储)

无效的下一个大小和双重免费错误

通过动态分配创建数组后,在C中通过realloc改变内存大小时出现问题