C语言关于括号匹配的问题

#include<stdio.h>#include<process.h>#include<stdlib.h>structstack{char*base;char*top;... #include<stdio.h>
#include<process.h>
#include<stdlib.h>
struct stack
{
char *base;
char *top;
int stack_size;
}stack1;
void Init_Stack(){
stack1.base=(char*)malloc(100*sizeof(char));
if(!stack1.base){
printf("Error!");exit(-2);}
stack1.top=stack1.base;
stack1.stack_size=100;
}
void Push(char f){
*stack1.top++=f;}
void Pop(char *g){
g=(--stack1.top);}
void main()
{
char a,*b=0;
Init_Stack();
printf("please input:");
a=getchar();
while(a!='#'){
if(a=='('||a=='[')Push(a);
else if(a==')'){
Pop(b);if(*b!='('){
printf("cannot\n");system("pause");exit(0);
}}
else if(a==']'){
Pop(b);if(*b!='['){
printf("cannot\n");system("pause");exit(0);
}}
a=getchar();
}
printf("can\n");
system("pause");
}
stack.exe 中的 0x0041160c 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
stack.exe 中的 0x0041160c 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
stack.exe 中的 0x0041160c 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
stack.exe 中的 0x0041160c 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
stack.exe 中的 0x0041160c 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
stack.exe 中的 0x0041160c 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
程序“[2060] stack.exe: 本机”已退出,返回值为 0 (0x0)。
怎么回事啊高手进 没考虑溢出或者xxx 不影响
------------------------
还有 这是调试时的提示 编译能过 但是调试过不了 vs2010的
展开
 我来答
zt_yes
2012-04-03 · TA获得超过544个赞
知道小有建树答主
回答量:238
采纳率:0%
帮助的人:56.3万
展开全部
只要在main函数中的定义改成下面这样
char a,*b=(char*)malloc(1*sizeof(char));
你的代码就能运行了,不会再出现以上的提示了。不过运行结果,应该和你设计的不一样。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cgx5555520
2012-04-02 · TA获得超过235个赞
知道小有建树答主
回答量:130
采纳率:0%
帮助的人:125万
展开全部
建设把 Pop(char *g) 改成 Pop(char &g)
函数内容改为 g=*(--stack1.top);
并将主函数中的 b 定义成 char b;

引用要比指针更可靠些
追问
C语言有引用吗?引用在数据结构那本书提到过 但我不会 解释下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6742c1f
2012-04-02 · 超过31用户采纳过TA的回答
知道答主
回答量:77
采纳率:0%
帮助的人:62.2万
展开全部
退出重新进就行了,我刚才看了你的代码可以运行的,有时候vc是有点bug 的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ssilspro
2012-04-02 · TA获得超过2625个赞
知道大有可为答主
回答量:1148
采纳率:0%
帮助的人:1703万
展开全部
void Pop(char *g){
*g=*(--stack1.top);
}
--------
void main()
{
char a,*b=&a;
更多追问追答
追问
为什么要这样改呢 能解释下不?
追答
函数传递参数都是复制值的, 所以想要修改传递的参数要传地址
传的地址本身还是复制过去的, 但可以通过地址修改指向的变量
char *g, g放的是地址, 用*解引用(*g)后才是g指向的变量, top里也是地址,要用它指向的也要解引用
*b也是指针, 你应该指向个变量才能修改,
地址0在大部分系统都不能用的, 你要指向变量,或分配空间, 不能随便指向未知空间,
你分配空间后, 直到释放, 系统不会把已分配的分配给别人,
如果你随便指向某个内存空间, 如果没权限还好,直接出错,
如果是别的已分配的内存, 你就修改到不一定什么地方的变量了, 虽然能运行,但逻辑可能不正确
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
陌_依旧
2012-04-02
知道答主
回答量:29
采纳率:0%
帮助的人:7.3万
展开全部
w
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式