您的位置:首页 > 编程语言 > C语言/C++

vs2012编译c语言-指针不能判NULL

2015-11-24 11:50 344 查看
这段代码codeblocks能正常运行,vs2012中运行时eval时报出错误,原因在于空指针不能判空。

做个小测试,给p4分配空间,其他什么都不做,按理说p4->l和p4->r都是null,测试显示都不是null。

把代码搬到codeblocks中,能判空,正常运行。

结论:编译器不一样,政策可能就不一样;vs中应该用别的方法来判空。

小测试

int  flag=0;
struct ast *p1=(struct ast*)malloc(sizeof(struct ast));
struct ast *p2=(struct ast*)malloc(sizeof(struct ast));
struct ast *p3=(struct ast*)malloc(sizeof(struct ast));
struct ast *p4=(struct ast*)malloc(sizeof(struct ast));
if(p4->l==NULL) flag=1; //运行结果,flag=0


源码

/*
Name:newtree.c
Author:LinWhite
Created on:2015-11-24
Function:vs2012 c代码测试变长参数的使用
*/
# include<stdio.h>
# include<stdlib.h>
# include<stdarg.h>

struct ast
{
char* name;
int tag;
struct ast *l;
struct ast *r;
};

void eval(struct ast *a)
{
if(a)
{
printf("%s\n",a->name);
printf(" ");
eval(a->l);
eval(a->r);
}
}
struct ast *newast(char* name,int num,...)
{
//printf("\n创建结点%s,num=%d\n",name,num);
va_list valist;
int i;
struct ast *a=(struct ast*)malloc(sizeof(struct ast));
struct ast *temp=(struct ast*)malloc(sizeof(struct ast));
struct ast *p=(struct ast*)malloc(sizeof(struct ast));
if(!a)
{
//yyerror("out of space");
exit(0);
}
a->name=name;
a->l=NULL;
a->r=NULL;
printf("\n创建结点%s,num=%d\n",a->name,num);
if(num>0)
{
va_start(valist,num);
temp=va_arg(valist, struct ast*);
a->l=temp;
printf("%s的left是%s\n",a->name,temp->name);
if(num>=2)
{
for(i=0;i<num-1;++i)
{
temp->r=va_arg(valist,struct ast*);
printf("%s的right是%s\n",temp->name,temp->r->name);
temp=temp->r;
}
}
}
printf("%s结点创建成功!\n",a->name);
return (struct ast*)a;
}

int main()
{
//printf(">");
int flag=0; struct ast *p1=(struct ast*)malloc(sizeof(struct ast)); struct ast *p2=(struct ast*)malloc(sizeof(struct ast)); struct ast *p3=(struct ast*)malloc(sizeof(struct ast)); struct ast *p4=(struct ast*)malloc(sizeof(struct ast)); if(p4->l==NULL) flag=1; //运行结果,flag=0p1->name="first";p1->tag=1;
p2->name="second";p2->tag=1;
p3->name="third";p3->tag=1;

p4=newast("fourth",3,p1,p2,p3);
eval(p4);
return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息