十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
按你说的,没有把指针返回也没有释放,那么函数返回时开辟的空间还在,但你已无法引用。
成都创新互联公司专业为企业提供平定网站建设、平定做网站、平定网站设计、平定网站制作等企业网站建设、网页设计与制作、平定企业网站模板建站服务,10余年平定做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
用malloc是在堆中分配的空间,用完需用自已显示释放.
采用如int
a=0的方式会在栈中分配空间,函数返回时栈指针回移,此空间仍能被其它函数使用(相当于自动释放)
其实写一个函数,开头的声明变量或数组就是在开辟空间,所以只要写代码,开辟空间的事肯定就少不了。但你这里说的我想应该是指“动态开辟空间”。动态开辟空间一般在以下情况下进行:
编程时不知道需要多大的空间,要在程序运行时由用户输入大小或计算出所需大小;
一些数据量太大,栈区放不下,需要创建在堆里;
由于某需要要求代码这样写。
大致就这些情况。
①C语言编码的时候不会开辟内存,只有在编译之后才会生成可执行程序,在可执行程序里面给出内存的开辟方法。
②真正内存的开辟是在程序运行的时候。程序装载到内存里面,开始运行才会真正开辟内存。
③C语言程序装载到内存中之后,其在内存中的进程空间中有代码区、全局数据区、堆区和栈区。代码区存放代码编译后的执行指令;全局数据区存放全局变量和静态变量;栈区存放函数内部的局部变量和返回地址,这部分内存是在函数调用时才申请的;堆区是自由申请内存的区域。需要使用malloc等自己分配内存,这部分内存需要自己释放。
④向int i;这样的句子,在C语言中,既是声明又是定义,所以这样的语句其实已经分配了内存,而不是等到赋值的时候。
⑤有不懂的可以追问。
#includestdio.h
#includestdlib.h
typedef struct Lnode
{
int data;
struct Lnode *next;
}Lnode,*LinkList;
LinkList Init()
{
LinkList L = NULL;
printf("%d ",L);
L=(LinkList)malloc(sizeof(Lnode));
printf("%d ",L);
L-next=0;
return L;
}
void main()
{
LinkList A = NULL;
printf("%d ",A);
A = Init();
}