首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

创建栈时的函数有关问题

2012-02-12 
创建栈时的函数问题#includestdio.h#includemalloc.h#define Stack_Size 100struct Snode{int data[St

创建栈时的函数问题
#include<stdio.h>
#include<malloc.h>
#define Stack_Size 100
struct Snode
{
int data[Stack_Size];
int top;
};
void Init_Stack(Snode *t)///2.然后对这里进行修改 void Init_Stack(Snode * &t)这样就可以了。可是我还是不明白。
                 ///这样形参接受的难道是指针的指针??呵呵,还是有点不明白
{
t=(struct Snode *)malloc(sizeof(struct Snode));
t->top=-1;
}
int main()
{
struct Snode *s;
Init_Stack(s);
printf("%d\n",s->top);
return 0;
}
//1.像这样运行时候就会出错。调试发现.s根本没有被分配到内存..
3.呵呵,希望好心人帮忙解释下,如果不麻烦的话能不能介绍片介绍关于函数传值的文章,拜谢



[解决办法]
这个帖子不应该发在这个论坛。
我认为错误的原理是这样的:
1、首先main函数中定义了一个struct Snode * s,假设在内存的0001地址中装了这个指针所指向的内容,那么现在内存的0001地址中的内容是随机的不确定的。
2、main函数中调用了Init_Stack函数,参数传递的时候做了这样的一件事:struct Snode * t=s;
也就是说,假设t在内存中的地址是0002(注意,是和s不同的),那么0002这块内存里所存储的内容和0001中所存储的是一样的了。
3、在Init_Stack函数中,用t申请了一块内存,这一步只能说明0002这块内存里所存储的是所申请的内存的地址。所以这并没有影响0001这块内存里存储的是什么,所以main中最后打印的时候会出错。

所以,若将Init_Stack函数修改为:
void Init_Stack(struct Snode ** t)
{
(*t)->(struct Snode *)malloc(sizeof(struct Snode));
(*t)->top=1;
}
调用时使用: Init_Stack(&s);
则正确。

热点排行