C语言中入栈函数无返回值时编译会出错,而有返回值时就没错。为什么。

[复制链接]
查看11 | 回复1 | 2011-5-14 09:22:06 | 显示全部楼层 |阅读模式
没错的例子;
#includestdio.h
typedefintDataType;
typedefstructNode{
        DataTypedata;
        structNode*next;
}StackNode,*LinkStack;

LinkStackPush_LinkStack(LinkStacktop,DataTypex)
{
        StackNode*s;
        s=newStackNode;
        s-data=x;
        s-next=top;
        top=s;
        printf(\"%d\",top-data);
        returntop;
}


main()
{
        LinkStacktop;
        top=Push_LinkStack(top,1);
        top=Push_LinkStack(top,2);
        top=Push_LinkStack(top,3);
        top=Push_LinkStack(top,4);
top=Push_LinkStack(top,5);
        printf(\"%d\",top-data);
}
出错的例子
#includestdio.h
typedefintDataType;
typedefstructNode{
        DataTypedata;
        structNode*next;
}StackNode,*LinkStack;

voidPush_LinkStack(LinkStacktop,DataTypex)
{
        StackNode*s;
        s=newStackNode;
        s-data=x;
        s-next=top;
        top=s;
        printf(\"%d\",top-data);
}


main()
{
        StackNode*top;
        Push_LinkStack(top,1);
        Push_LinkStack(top,2);
        Push_LinkStack(top,3);
        Push_LinkStack(top,4);
        Push_LinkStack(top,5);
        printf(\"%d\",top-data);//问题出现在这里,上面那个例子可以显示出值,而这个不可以,为什么,求详细解答。
       
}
回复

使用道具 举报

千问 | 2011-5-14 09:22:06 | 显示全部楼层
因为LinkStackPush_LinkStack(LinkStacktop,DataTypex)中你传递的只是地址的一个拷贝,这里top只是形参,他不是主程序里面的那个top,函数作用过后,主程序的那个top(地址)并没有改变。只有当你把函数反回地址的值赋值给他后主程序的top才变了,所以有返回赋值的不会出错。
如果你不要返回值void,函数可以这样写:
voidPush_LinkStack(LinkStack*ptop,DataTypex)
{
        StackNode*s=0;
        s=newStackNode;
        s-data=x;
        s-next=*ptop;
        *ptop=s;
        printf(\"%d\",(*ptop)-data);
        return;
}
并且调用时,要Push_LinkStack(这样就可以了。
函数的指针传递没搞懂埃。。不要以为你传递的是指针,在这里你传递的就是一般的值传递(passbyvalue),不过这个值是个地址罢了,你可以改变top指向的内容,但你不能改变top本身的值
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行