如其一个指针函数没有定义返回值,那么在调用完毕后会返回什么

如果一个指针函数没有定义返回值,那么在调用完毕后会返回什么?
如题,今天看到一个视频这样做过,很好奇..

------解决方案--------------------
返回值一般保存在eax寄存器中,所以如果没赋值返回值,也就是没对eax赋值,那么你读取eax即返回的值是不确定的。
------解决方案--------------------
显然程序错了啊!create函数接口没有返回,也就是malloc的地址没有返回!
在接口里堆内存不返回如何使用如何调用释放?
代码有问题!在哪里复制过来的啊?
------解决方案--------------------
引用:
Quote: 引用:

什么“视频”误人子弟?敢不敢让作者曝光下。

其实代码是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h> 
#include <time.h>
struct node   //定义一个node结构体
{
long  data; //存放数据的一个或者多个项 
long count;
struct node *pLeft;  //左孩子 指向一个二叉树
struct node *pRight; //右孩子  指向一个二叉树
};

struct node * CreateNode(long value)   //创建根结点的函数
{
struct node *p=malloc(sizeof(struct node));   //为p分配内存空间
p->pLeft=p->pRight=NULL;   //将左右孩子都置空
p->data=value;             //data赋值为传进来的value的值
p->count=1;
}
struct node * AddNode(struct node * pNode,long v)   //创建“孩子”的函数
{
//情况一 pNode==NULL
if (pNode==NULL)
{
return CreateNode(v);
}
// pNode->data=v
if (pNode->data==v)
{
pNode->count++;
return pNode;
}
//v大于结点数据
if (v>pNode->data)
{
if (pNode->pRight==NULL)
{
pNode->pRight=CreateNode(v);
return pNode->pRight;
}else return AddNode(pNode->pRight,v); //递归调用
}
//v小于 结点数据
if (v<pNode->data)
{
if (pNode->pLeft==NULL)
{
pNode->pLeft=CreateNode(v);
return pNode->pLeft;
}else return AddNode(pNode->pLeft,v); //递归调用
}

return NULL;
}
int main(void)
{
struct node*root;
long v,i;
printf("请输入二叉树根结点数值:");
scanf("%d",&v);
root=CreateNode(v);   //创建根结点
for (i=0;i<=10;i++)  
{
AddNode(root,i);   //加入10个孩子 
}

getchar();
return 0;
}
在倒数第8行的位置不懂,root=CreateNode(v);   //创建根结点 ,不知道是我表达错了,还是程序错了..


程序肯定错误了,用VC编译的话会认为没有返回值,错误。使用gcc编译倒是没有问题,
程序可能运行还是能显示值啥的,因为,虽然没有返回值,实际在createnode(v)后,还是有一个值赋给root,但这个值完全是不可知的,可能正确,可能不正确。而视频中的root值可能指向一个可以读写的内存,所以运行看上去似乎是正确的。
------解决方案--------------------
恩,程序有错:

CreateNode(v);

函数体少了个return语句。

返回值一般都是通过通用寄存器eax返回,也就是在退出函数时候,要返回的值会存储到eax中去,然后再赋值给主调函数中的变量。如果不使用,就简单的抛弃。

注意:最多只能返回一个值,因此一个寄存器就够了!如果想多个返回,可以使用传参数引用或者指针方式,或者返回多个值合成的结构体