c语言structmalloc
A. c语言求解 malloc 函数怎么用,能用单连表举例吗
//下面是我帮一个网友改的单链表练习:
#include<stdio.h>
#include<malloc.h>
#defineLENsizeof(structXX)
structXX
{
inta;
structXX*next;
};
intn;
structXX*creat()
{
structXX*head;
structXX*p1;
n=0;
p1=(structXX*)malloc(LEN);
printf("请输入整数并回车,输入0,并回车结束输入! ");
scanf("%d",&p1->a);
head=NULL
while(p1->a!=0)//a=0退出
{
n=n+1;
if(n==1)
head=p1;
p1->next=(structXX*)malloc(LEN);
scanf("%d",&p1->next->a);
p1=p1->next;
}
p1->next=NULL;//把链表的最后指向空
return(head);
}
voidprint(structXX*head)//因为传入的实参是指针类型,形参也该定义为指针类型{
structXX*p;
printf(" 输入的数据有%d个,分别是: ",n+1);
p=head;
if(head!=NULL)
do
{
printf("%d ",p->a);
p=p->next;
}
while(p!=NULL);
}
voidmain()
{
structXX*head;//因为creat()函数返回的是指向结构体的指针,所以这里应该定义为指向结构体的指针变量
head=creat();
print(head);
}
B. C语言中的malloc函数用法>
C语言中malloc是动态内存分配函数。
函数原型:void *malloc(unsigned int num_bytes)。
参数:num_bytes 是无符号整型,用于表示分配的字节数。
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
实现malloc的方法:
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
C. C语言中 malloc()函数的返回值
malloc()函数返回值类型是void型指针,是你申请的内存空间首地址,个人理解之所以是void*是因为你申请的空间存储数值类型不同,例如
12345678int *p=(int *)malloc(sizeof(int)*100);//可存储100个整形变量,100*4Bytes//可以是 结构体:typedef struct TEST{ int a; int b; char c[4];}Test;Test *p=(Test *)malloc(sizeof(Test)*4);//大小为Test p[4]数组相同
D. c语言中malloc是什么怎么用
malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size);
说明:
【参数说明】
size 为需要分配的内存空间的大小,以字节(Byte)计。
【函数说明】
malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用 calloc() 函数。
【返回值】
分配成功返回指向该内存的地址,失败则返回 NULL。
操作:
由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。
如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。
注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:
#include<stdlib.h>
typedef int ListData;
ListData *data; //存储空间基址
data = ( ListData * ) malloc( 100 * sizeof ( ListData ) );
(4)c语言structmalloc扩展阅读
实现malloc的方法:
(1)数据结构
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
(2)寻找合适的block
现在考虑如何在block链中查找合适的block。一般来说有两种查找算法:
First fit:从头开始,使用第一个数据区大小大于要求size的块所谓此次分配的块
Best fit:从头开始,遍历所有块,使用数据区大小大于size且差值最小的块作为此次分配的块
两种方式各有千秋,best fit有较高的内存使用率(payload较高),而first fit具有较高的运行效率。这里我们采用first fit算法。
(3)开辟新的block
如果现有block都不能满足size的要求,则需要在链表最后开辟一个新的block。
(4)分裂block
First fit有一个比较致命的缺点,就是可能会让更小的size占据很大的一块block,此时,为了提高payload,应该在剩余数据区足够大的情况下,将其分裂为一个新的block。
(5)malloc的实现
有了上面的代码,我们就可以实现一个简单的malloc.注意首先我们要定义个block链表的头first_block,初始化为NULL;另外,我们需要剩余空间至少有BLOCK_SIZE+8才执行分裂操作
由于我们需要malloc分配的数据区是按8字节对齐,所以size不为8的倍数时,我们需要将size调整为大于size的最小的8的倍数。
E. c语言结构,在这里如何使用malloc函数
p=(structstu*)malloc(sizeof(structstu)*nod);
for(i=0;i<nob;++i)
{
...
scanf("%d",&p[i].num);
...
}
F. 关于malloc(结构体)失败的问题(c语言)
额,奇怪,我跑过了,没问题呀。不过我是C++的工程就是了。
一般来说,只有在内存不足时malloc才会返回NULL。
题外话,用过malloc后,记得调用free,不然会有内存泄漏。
G. C语言 链表中malloc 用处: 比如head=(struct student *)malloc(sizeof(struct student)); 望大虾指教··
申请一块大小为 sizeof(struct student) 的内存并返回这块内存的首地址 (struct student *)是强制类型转换 将其首地址转换为结构体类型 head=(struct student *)malloc(sizeof(struct student)); 是让链表的头指针指向这块内存的首地址
H. c语言malloc函数的用法
出现了两个错误:1、phonebook=(struct date *)malloc(100*sizeof(struct date*));这个语句中的(struct date *)应该是(struct data *),这个是楼主太粗心了。2、这里的类型明显不匹配,phonebook的类型是指向struct data结构体的指针数组,struct data *的类型是指向struct data结构体的指针。我没有看具体程序是什么功能,若是改成这样程序运行是没有错误的。phonebook[0]=(struct data*)malloc(100*sizeof(struct data));
I. c语言malloc无法分配内存
动态分配的内存是不可以通过sizeof来确定大小的。或者说 所有的指针类型都不可以。
sizeof的结果是指针本身的大小,对于32为编译器,都是4
只要你malloc的返回结果不是NULL,这个内存就可以放心的用了。
J. C语言怎么理解链表 p=(struct stu *)malloc(sizeof(struct stu))为什么新开辟的空间也有个元素 i
malloc 分配一段空间,其参数是空间的大小(单位是字节) 比如malloc(5),是分配一段五个字节大小的空间。其返回值的类型是void *。因此赋值的时候要经过强制类型转换 sizeof() 是计算参数所占的空间大小。如果参数是一个类型,那就是这种类型的数据的大小,如果是一个变量,那就是这个变量的大小。 那句语句的意思是 分配一个 大小为结构体stu的大小的空间,并把空间地址赋予p