vs2012编译c语言-指针不能判NULL
2015-11-24 11:50
344 查看
这段代码codeblocks能正常运行,vs2012中运行时eval时报出错误,原因在于空指针不能判空。
做个小测试,给p4分配空间,其他什么都不做,按理说p4->l和p4->r都是null,测试显示都不是null。
把代码搬到codeblocks中,能判空,正常运行。
结论:编译器不一样,政策可能就不一样;vs中应该用别的方法来判空。
做个小测试,给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;
}
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 浅谈汇编器、编译器和解释器
- 如何写好 C main 函数
- 让我们做个简单的解释器(三)
- 让我们做个简单的解释器(一)
- 用 350 行代码从零开始,将 Lisp 编译成 JavaScript
- Lua和C语言的交互详解
- C#中结构体和字节数组转换实现
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构