gcc exec if和else too ...这是一个bug吗?

时间:2014-11-22 15:43:36

标签: c++ c gcc

使用gcc 4.6.3版(Ubuntu / Linaro 4.6.3-1ubuntu5)

在指针a:

上使用if else语句时
if(a==NULL)
    ....
else
   .....

两者都被执行了。有人可以解释一下吗?

这里是使用malloc c / c ++函数实现dinamic列表的代码的一部分。

编译代码:

#include <iostream>
#include <cstdlib>
using namespace std;
struct simplelist {int v;struct simplelist *ptr;};
void push(simplelist &s,int value);
void printlist(simplelist &s);

int main()
{
struct simplelist list; list.ptr=NULL;
push(list,1); push(list,2); push(list,3); push(list,4);
int v=0; v=getsize(list); cout<<"size: "<<v<<endl;
return 0;
}
void push(simplelist &s,int v)
{
if (s.ptr==NULL)
{
    s.v=v;
    s.ptr=(simplelist *) malloc(sizeof(simplelist));
    if(s.ptr==NULL) cout<<"out of memory"<<endl; 
}
else
    push(*s.ptr,v);
}

int getsize(simplelist &s)
{
int v=1;
if (s.ptr==NULL)
    {
        v--;
        cout<<"getsize s.ptr=null"<<endl; //here bug?
    }                                     //program exec if and else statement

else
{
    v=v+getsize(*s.ptr);
    cout<<"getsize elsewere"<<endl;
}


return v;
}

我得到了输出:

getsize s.ptr=null
getsize elsewere
getsize elsewere
getsize elsewere
getsize elsewere

2 个答案:

答案 0 :(得分:2)

您的功能只是以相反的顺序打印消息。 (第一条消息与最后一个元素相关,依此类推。)

else
{
    v=v+getsize(*s.ptr);
    cout<<"getsize elsewere"<<endl;
}

必须是

else
{
    cout<<"getsize elsewere"<<endl;
    v=v+getsize(*s.ptr);
}

答案 1 :(得分:1)

由于其递归结构,getsize()为列表中的每个节点打印出一行。最后一个节点首先打印,并且是ptrNULL的唯一节点。