指针运算问题

HeSWWW 2009-04-14 10:15:33
stackLength();函数的返回值让人莫名奇妙……
希望有人详细解释一下……


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

#define STACKSIZE 512
#define OK 1
#define ERROR 0

typedef int SElem;

struct Stack{
SElem base[STACKSIZE];
SElem *top;
};

int initStack(struct Stack *S);
int stackLength(struct Stack S);
int pop(struct Stack *S, SElem *e);
int push(struct Stack *S, SElem e);


int main(int argc, char *argv[])
{
int e;
int *p = &e;
int flag = 1;
struct Stack S;
initStack(&S);
printf("%p--%p\n", S.top, S.base);
int i;
for (i = 0; i < 3; ++i){
push(&S, i);
printf("%p\n", S.top);
}
do {
pop(&S, p);
printf("%p--", S.top);
printf("%d", *p);
flag = stackLength(S);
printf("--%d\n", flag);
} while (flag);
system("PAUSE");
return 0;
}

int initStack(struct Stack *S)
{
S->top = S->base;
return OK;
}

int stackLength(struct Stack S)
{
return S.top - S.base;
}

int push(struct Stack *S, SElem e)
{
if (S->top < S->base + STACKSIZE - 1){
*S->top = e;
S->top++;
return OK;
}
return ERROR;
}

int pop(struct Stack *S, SElem *e)
{
if (S->top > S->base){
*e = *--S->top;
return OK;
}
return ERROR;
}

...全文
203 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liliangbao 2009-04-14
  • 打赏
  • 举报
回复
int stackLength(struct Stack *S)
{
return (S->top - S->base) / sizeof(SElem);
}
Up~
HeSWWW 2009-04-14
  • 打赏
  • 举报
回复
额……

理解了……

结构做参数传值调用时,结构体中的数组成员仅能保证数组中元素值不变……数组的位置则会改变

结贴,结贴……谢了各位……
traceless 2009-04-14
  • 打赏
  • 举报
回复
有一点很关键

int stackLength(struct Stack S); //这个传的是结构体的副本

假如说:base在main函数里的地址是0x12345678,则一开始top的值也是0x12345678
但是你int stackLength(struct Stack S)后,
base的地址也许就变成了0x87654321,而top的值还是0x12345678,因为top属于结构体里的一个数值,
copy的时候,top不改变。但是base这个数组所在的栈的位置是改变的

int stackLength(struct Stack S)
{
printf("\nstactlength:%p--%p\n",S.top,S.base); //跟踪
return S.top - S.base;
}


另外:
在main()的do while()里也加一句跟踪,你就清楚了
printf("--%d\n", flag);
getch(); //加这句跟踪
morris88 2009-04-14
  • 打赏
  • 举报
回复
int stackLength(struct Stack S)
{
return S.top - S.base;
}

貌似该为:

int stackLength(struct Stack *S)
{
return (S->top - S->base) / sizeof(SElem);
}
foxyz123 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 HeSWWW 的回复:]
额……确实如此

不过附加一问

int stackLength(struct Stack S);
S应该是实参的副本,那么其中S.top和S.base的值应该和实参中对应的值相等,为什么会出错呢?

而且……改动之后问题解决……但再次改为int stackLength(struct Stack S);后问题未重现……

有谁能解释一下?在DEV-C++4.9.9.0和VC 6.0下的调试都出现过返回值不正常的问题……
[/Quote]


注意,你这里的副本中S->top 与S->button 所保存的值是栈中的地址值,而并不是原来S在静态区的地址值
  • 打赏
  • 举报
回复
int stackLength(struct Stack &S)     //改传引用,结果就正常了,有内部指针的结构,最好别传副本,这样有悬垂指针的危险.
{
return S.top - S.base;
}
HeSWWW 2009-04-14
  • 打赏
  • 举报
回复
说错了……是改为int stackLength(struct Stack S);问题重现……

所以应该不是出栈不正常……
HeSWWW 2009-04-14
  • 打赏
  • 举报
回复
额……确实如此

不过附加一问

int stackLength(struct Stack S);
S应该是实参的副本,那么其中S.top和S.base的值应该和实参中对应的值相等,为什么会出错呢?

而且……改动之后问题解决……但再次改为int stackLength(struct Stack S);后问题未重现……

有谁能解释一下?在DEV-C++4.9.9.0和VC 6.0下的调试都出现过返回值不正常的问题……
  • 打赏
  • 举报
回复
int pop(struct Stack *S, SElem *e)
{
if (S->top > S->base){
*e = *--S->top;
return OK;
}
return ERROR;
}



是你的出栈操作没成功吧.
jame2001 2009-04-14
  • 打赏
  • 举报
回复

int stackLength(struct Stack *S);
flag = stackLength(&S);
int stackLength(struct Stack * S)
{
return S->top - S->base;
}
goodname 2009-04-14
  • 打赏
  • 举报
回复
是不是要这样才可以?
int stackLength(struct Stack *S)
{
return S->top - S->base;
}

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧