关于数制转换的realloc函数问题

[复制链接]
查看11 | 回复8 | 2021-1-27 06:45:35 | 显示全部楼层 |阅读模式
#include
#include
#include
#defineOVERFLOW3
#defineOK1
#defineERROR-1
#defineTRUE1
#defineFALSE-1
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefstruct{
int*base;
int*top;
intstacksize;
}SZZH;
intInitStack(SZZHL)
{
L.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!L.base)exit(OVERFLOW);
L.base=L.top;
L.stacksize=STACK_INIT_SIZE;
returnOK;
}
intPush(SZZHL,inte)
{
if(L.top-L.base>=L.stacksize)
{
int*p;
p=L.base;
p=(int*)realloc(L.base,(L.stacksize+STACKINCREMENT)*sizeof(int));
if(!(p))exit(OVERFLOW);
L.base=p;
L.top=L.base+L.stacksize;
L.stacksize=L.stacksize+STACKINCREMENT;
}
*(L.top++)=e;
returnOK;
}
intGettop(SZZHL,intf)
{
if(L.base==L.top)returnERROR;
f=*(L.top-1);
returnOK;
}
intPop(SZZHL,intw)
{
if(L.base==L.top)returnERROR;
w=*(--L.top);
returnOK;
}
voidmain()
{
SZZHConverse;
InitStack(Converse);
printf("pleaseInputthenumYouwanttoconverse:");
intN,n;
scanf("%d",&N);
printf("数制:");
scanf("%d",&n);
while(N){
Push(Converse,N%n);
N=N%n;
}
inte;
while(Converse.base!=Converse.top)
{
Pop(Converse,e);
printf("%d",e);
}
}
这是我写的那个数制转换程序,我用GDB调试好多次,就是到了Realloc那个地方,出现,invalidoldsize错误。。。

***Errorin`/home/stan/szzh':realloc():invalidoldsize:0x00000000004008c0***
ProgramreceivedsignalSIGABRT,Aborted.
0x00007ffff7a4acc9in__GI_raise(sig=sig@entry=6)
at../nptl/sysdeps/unix/sysv/linux/raise.c:56
56../nptl/sysdeps/unix/sysv/linux/raise.c:没有那个文件或目录.
就是这个错误,我做的通讯录等等都是这个Realloc函数出错,我挣扎好多天了,请大神帮忙解决,感激不尽啊!!!!
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
用valgrind调一下吧
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
InitStack应该用指针或者引用作为函数参数吧,不然你在函数中修改的只是一个复本
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
引用2楼paschen的回复:InitStack应该用指针或者引用作为函数参数吧,不然你在函数中修改的只是一个复本
同意。
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
额,可以讲得清楚点吗?有点不理解。。
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
引用4楼zbgg222的回复:额,可以讲得清楚点吗?有点不理解。。

你函数中的参数不是外面传进去的,而是外对象复制后的对象,所以你在函数中的修改都对外面的对象没有影响
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
哦,是不是大概就是那种,实参和形参之间的值传导是单向的?这种解释
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
引用6楼zbgg222的回复:哦,是不是大概就是那种,实参和形参之间的值传导是单向的?这种解释
举个例子:
voidswap(inta,intb)
{
intt=a;
a=b;
b=t;
}
这个函数交换两个变量,可是不会成功,因为参数是复制进来的,所以你交换的只是你原参数的一个副本,实际的参数并没有被交换,你的原因同理,具体看语法书啊,可以通过指针传递来解决
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
恩,貌似和我说的意思是一致的,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行