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

这段代码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=0
    p1->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语言,结构体,编译器,变长参数)