为什么free()函数中LNode->next为NULL

作者&投稿:通耿 (若有异议请与网页底部的电邮联系)
为什么建立一个头结点的时候要使头结点的指针域为空如: h=(LNode *)malloc(sizeof(LNode)); h->next=NULL~

头插法建链表后面一般还要跟上几句话:(设P为指向目标新建节点的指针)
p -> next = head -> next ;
head -> next = p ;
头结点的next为NULL时,可以方便的讲链尾元素的next自动设成nextNULL

innode 作为指向要插入元素的位置的指针,来标记要插入的位置

如果前面有定义typedef int elemtype
那int型 和 elemtype型 是一样的,只是用elemtype有两个好处:
1.看着好看,方便标识,不然如果你的程序里有很多int的话,会非常难调试。
2.方便修改,如若以后的程序需要二次开发,需要改数据类型的话不必每个int 都改,直接改typedef定义就行了。

malloc是动态开辟内存,函数返回为void型指针(指向开辟的内存空间)
前面那个括号是开辟内存的类型,如L=(LNode*)malloc(sizeof(LNode)),就是将原来malloc返回的void型指针强制定义为 LNode型(也就是你一开始定义的指针L的类型),这样才可以赋值给L.

sizeof(LNode)是指malloc开辟的内存空间的大小,这里就是指,这个大小为LNode型所占的容量.(例如sizeof(int),就是开辟一个整形的空间(4字节).分配两个int的空间就是2*sizeof(int))

上面的代码有好几处错误,写出来怕说不清楚,我改了下上面的代码,楼主可以揣摩下,不明白的可以Hi

int AskMemory2(struct LinkNode *LNode)
{
int j=0,count=0;
struct LinkNode *L=NULL,*H=NULL;

assert(NULL!=LNode);
if(NULL==LNode) exit(0);

H=LNode; //保存头地址

while(true)
{
H->next=NULL; //初始化为NULL

printf("\t是否继续申请空间(1/0):");
scanf("%d",&j);
if(0==j) break;

L=(struct LinkNode *)malloc(sizeof(struct LinkNode)); //申请一个空间
H->next=L; //添加的链表中
H=H->next; //往后移动指针

count++;

}

return count; //返回本次添加了几个节点

}

int FreeMemory2(struct LinkNode *LNode)
{
int count=0;
struct LinkNode *L=NULL;

while(NULL!=LNode)
{
L=LNode->next;
free(LNode);
LNode=L;

count++;
}

return count;
}

void main()
{
static struct LinkNode *Head=NULL;
Head=(struct LinkNode *)malloc(sizeof(struct LinkNode));

printf("总共申请的节点数=%d\n",AskMemory2(Head)+1); //+1是因为上面申请了一个节点了
printf("总共释放的节点数=%d\n",FreeMemory2(Head)); //在这里把所有节点全部释放的了
}

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
struct LinkNode
{
char name[12];
int age;
struct LinkNode *next;
}LinkNode,*LNode;
//struct LinkNode *Head=NULL;
struct LinkNode* AskMemory(struct LinkNode *LNode)
{
struct LinkNode *L=NULL;int i=0,j=0;
LNode=(struct LinkNode *)malloc(sizeof(struct LinkNode));
//assert(NULL!=LNode);
if(NULL==LNode) exit(0);
L=LNode; //很奇怪,为什么这里将LNode赋给L了,但LNode->next已有值了,而L->next还是空??
//链表首结点,当然要先保存,最后返回给调用函数。
LNode->next=NULL;//新结点,子结点为空。
LNode=LNode->next;//错误!!赋值后失去结点信息。删去这一行
//这里必须用来返回数值,否则,因为LNode后移了,当返回时返回的指针的下一个指针是NULL
for(i=1;i<4;i++)
{
LNode=(struct LinkNode *)malloc(sizeof(struct LinkNode));
//LNode->next=(struct LinkNode *)malloc(sizeof(struct LinkNode));//申请子结点
assert(NULL!=LNode);
//assert(NULL!=LNode->next);//子结点是否为空
LNode->next=NULL;
//LNode->next->next=NULL;//子结点的子结点为空
printf("\t是否继续申请空间(1/0):");
scanf("%d",&j);
if(0==j) break;
LNode=LNode->next;//子结点转成父结点
}
LNode=L;
//return(L);
return(LNode);//只能返回全局变或静态变量的地址
}
/*struct LinkNode*/void FreeMemory(struct LinkNode *LNode)
{
struct LinkNode *L=NULL;
while(NULL!=LNode)
{
L=LNode->next;
free(LNode);
LNode=L;
L=LNode->next;
}
//return(LNode);
}
void main()
{
static struct LinkNode *Head=NULL;
Head=(struct LinkNode *)malloc(sizeof(struct LinkNode));
assert(NULL!=Head);
Head->next=NULL;
Head->next=AskMemory(Head->next);//若像这样,为什么Head->next回来还是空呢
FreeMemory(Head->next);
free(Head);
}


请用C语言编写 malloc realloc free 函数。
void free(void *firstbyte) { struct mem_control_block *mcb;\/* Backup from the given pointer to find the mem_control_block \/ mcb = firstbyte - sizeof(struct mem_control_block);\/* Mark the block as being available *\/ mcb->is_available = 1;\/* That's It! We're done. *...

请问new 申请一个char数组的内存地址空间,可以用free来释放吗?_百度知 ...
new和delete是c++的运算符,在没有重载的时候,默认也是调用mallloc()和free(),由于c++的类有构造函数和析构函数,为类的对象指针分配内存时需要对该类对象初始化数据,释放内存时需要有可能需要释放对象内部的成员的内存,用new和delete就会去干这些事情,而调用mallloc()和free()函数,需要手动去处理类...

freertos
FreeRTOS在任务、队列和信号量创建过程中对内存的需求是明确的。尽管malloc()和free()函数在一般情况下能管理内存,但在嵌入式系统的特殊环境中,它们并非总是适用,且存在不确定性,如占用的程序空间可能不固定,可重用性不足,执行时间难以预估。为了解决这些问题,FreeRTOS提供了两种备选的内存分配策略...

C语言中malloc函数的使用方法
功能:分配长度为num_bytes字节的内存块 注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。实例:include"stdio...

C语言中的malloc函数用法>?
C语言中malloc是动态内存分配函数。函数原型:void *malloc(unsigned int num_bytes)。参数:num_bytes 是无符号整型,用于表示分配的字节数。注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char...

...个指针开辟了100的空间,然后在主程序中free()会报错吗?
如果指针是全局量,主程序中free是可以的。如果指针是函数局部量,主程序中free会报错 -- 错误:未声明的标识符。

如何判断可逆过程是否发生?(亥姆霍兹自由能)
dS-δQ\/T环≥0;代入第一定律的公式δQ=dU十δW,得 δW≤-(dU-T环ds)若体系的最初与最后温度和环境的温度相等,即T1=T2=T环,则 δW≤-d(U-Ts) (2.27)令 F===U-TS (中间横线上为def) (2.28),F称为亥姆霍兹自由能(Helmholz free energy),亦称亥姆霍兹函数,又称为功函...

C++中new和delete比 malloc和free有哪些优点?
malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。函数free 的原型如下: void free( void * memblock ); 为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p 的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p 是NULL 指针,那么fre...

c语言中的free(void*p)函数,的参数类型是void*类型,如果定义一个指针变...
c语言中的void 指针可以指向任何类型变量。就是说任何类型的指针变量都可以隐式转换成void类型

C语言free头文件
free()函数包含在头文件stdlib.h里的

休宁县13459194429: c语言中 free的用法~ -
只咳盐酸: malloc用来动态申请内存空间,而free用来释放malloc申请的空间.如: struct { int a; int b; }node; main() { node *lnode; lnode->a=33; lnode->b=99; lnode=(node*)malloc(sizeof(node)); printf("a=%d b=%d",lnode->a,lnode->b); free(lnode); return 0; }

休宁县13459194429: 为什么free()函数中LNode - >next为NULL -
只咳盐酸: 上面的代码有好几处错误,写出来怕说不清楚,我改了下上面的代码,楼主可以揣摩下,不明白的可以Hi int AskMemory2(struct LinkNode *LNode) { int j=0,count=0; struct LinkNode *L=NULL,*H=NULL; assert(NULL!=LNode); if(NULL==LNode) ...

休宁县13459194429: free(B)为释放源头节点,即修改了B链表,为什么函数参数写LNode*B而不是LNode*&B -
只咳盐酸: 你可以理解,函数定义的时候,参数的表现形式,是对一个变量的定义 XXXX(LNode *B ) 这里定义的B,就是一个LNode类型的指针

休宁县13459194429: C语言释放链表内存的问题 -
只咳盐酸: 把链表创建的函数贴出来.否则难以判断.还有LNode 和LinkList的类型定义贴出来 再请求一次,把LNode 和LinkList的类型定义贴出来!从 L->next;的用法,我推测LinkList是一个结构体指针类型,,作用是指向链表头.可是你在malloc的时...

休宁县13459194429: C语言中free函数的用法 -
只咳盐酸: free函数的用法释放ptr指向的存储空间.被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配. free 不管指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete/delete [] 要方便.如在分配指...

休宁县13459194429: C中free()函数的原理是什么啊,求高手指点,最好能够说详细些,比如内存是怎么变化的,函数原型是什么! -
只咳盐酸: 简单说 free()函数就是释放指针所指向的地址,为运行程序来腾出内存空间. 例如: int a=1; int *p;p=&a; free(p); 上面一段程序 当你为指针p赋值时,该指针内存放的是整型变量a的地址,当时用free(p)释放内存空间后,该指针p随即被销毁,那p指向的空间自然便被释放出来以供其他变量使用.就是这个原理

休宁县13459194429: C语言:关于FREE()函数的用法 -
只咳盐酸: 不可以的. malloc, alloc, free是c定义的一组内存管理的API函数,当你调用malloc、alloc分配内存时,不仅仅是从堆里面分配得到了可用内存,实际上内存管理子系统还会维护了内存列表.你自己定义的指针不会在这个列表中的,所以free会出问题的.那么,使用new, GlobalAlloc之类的方式分配的内存可不可以使用free呢.我的回答是,尽量不要,大部分情况都会带来风险.这里面涉及new, malloc, GlobalAlloc, HeapAlloc, LocalAlloc,VirtualAlloc等函数的区别.

休宁县13459194429: c 语言free函数用法
只咳盐酸: free()释放已分配内存的函数 原形:void free(void *block) 功能:释放由calloc、malloc、realloc函数调用所分配的内存. 头文件:stdlib.h、alloc.h 所以你上面所做的和没加free(p)是一样的额

休宁县13459194429: c语言中的字符串指针释放free问题 -
只咳盐酸: 1、free函数:原型:void free(void *ptr);功能:释放malloc(或calloc、realloc)函数给指针变量分配的动态内存;头文件:malloc.h或stdlib.h;2、为了避免释放已经释放了内存的指针内存,或没有释放内存,在C语言中最好是在定义指针时赋初...

休宁县13459194429: C++中,free函数为什么会报错? -
只咳盐酸: 如果是编译错误,则表明没有包括头文件cstdlib 如果是运行错误,则表示free函数参数的指针值有错误,主要如下: 1、指向目标并不是可以释放的空间 2、指向目标已经释放过了,现在重复释放 3、指针值为0 4、不是原来动态分配空间的首地址 具体情况还得看看代码才行

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网