realloc():C 中的下一个大小无效
realloc(): invalid next size in 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;
只会改变语言环境的值,而不是调用函数的值。
您必须使用双指针或 return 值。
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()
中更改此行为。
新年快乐!
我一直在努力寻找导致错误的原因,我将在下面解释一段时间,如果您能提供帮助,我将不胜感激。我有以下代码,原则上应该实现一个堆栈:
#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;
只会改变语言环境的值,而不是调用函数的值。
您必须使用双指针或 return 值。
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()
中更改此行为。