三九宝宝网宝宝教育教学论文

c语言 malloc函数在链表中的用处

03月06日 编辑 39baobao.com

[求c语言实现图形界面c c c语言都可以]那得学习windows编程了。。。用VC6.0新建一个wn32程序,而不DOS程序,输入如下代码即可:#include#include#include#includeint g_nYPos = 200; //文字的Y坐标 long WINAPI WndProc...+阅读

没说是结构体就必须要分配一块内存;

首先,结构体和int char dobule等等一样,也是一种数据类型,无非是有点特殊而已;

那么,按如下 的例子:

char *p = NULL; //p 这个时候只能装指针,也就是一个地址,超过了就错误了。

有时候,我们想将一个字符串拷贝到 p 所指定的地址(不是把字符串的地址给p,注意区别),这个时候就需要有以下三个步骤:

1, 在堆(注意不是栈)上划一个区域,区域大小看你的心情。

2, 然后将这个区域的地址 赋值给 p;

3,循环将一个字符串拷贝到p所指向的区域。

代码就如下:

char * p = (char*)malloc(sizeof(128));

memset(p, 0, 128);

memcpy(p, src);做个比较,这个时候看 char p 和 char *p 有什么不同?

char p; //是程序自动在栈上分配了空间

char *p = malloc()// 是在堆上分配了空间;

如果是结构体,假设:

struct A {};

A a; //那这个时候,一般来说,就类似于 char p;在栈上分配空间;(但是结构体内部的东西另说);

A *a ;// 这个时候,就类似于 char *p;//有可能你需要手动在堆上分配空间。

简单来说,如果是指针,可能会涉及到malloc分配,非指针的话,就没有malloc一说。

你看你的结构体 定义的变量是不是一个指针型的

如何用malloc做一个动态链表

比如可以这样:

int *p=(int*)malloc(sizeof(int));

但是要包含头文件#include

你可以参考下面的代码:

#include

#include

struct student

{

char name[20];

int score;

struct student *next;

};

int main()

{

int i;

char c;

student *h,*p;//h为头指针

h=NULL;

for(i=0;i<5;i++)

{

if(h==NULL)

{

h=(student*)malloc(sizeof(student));

gets(h->name);

scanf("%d%c",&h->score,&c);

h->next=NULL;

p=h;

}

else

{

student *s=(student *)malloc(sizeof(student));

gets(s->name);

scanf("%d%c",&s->score,&c);

p->next=s;

p=s;

s->next=NULL;

}

}

p=h;

while(p!=NULL)

{

printf("%s,%d\n",p->name,p->score);

p=p->next;

}

return 0;

}

C语言中malloc函数的使用方法

C语言中malloc是动态内存分配函数。

函数原型:void *malloc(unsigned int num_bytes);

参数:num_bytes 是无符号整型,用于表示分配的字节数。

返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)

功能:分配长度为num_bytes字节的内存块

注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

实例:

#include"stdio.h"

#include"malloc.h"//malloc()函数被包含在malloc.h里面

int main(void)

{

char*a=NULL;//声明一个指向a的char*类型的指针

a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a

if(!a)//如果malloc失败,可以得到一些log

{

perror("malloc");

return-1;

}

sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址

printf("%s\n",a);//输出用户输入的数据

free(a);//释放掉使用的内存地址

return0;//例2有无内存泄露?

}

c语言中malloc是什么?怎么用

C语言中malloc是动态内存分配函数。函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数;返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他类型);头文件:#include或 #include(注意:alloc.h 与 malloc.h 的内容是完全一致的。)功能:分配长度为num_bytes字节的内存块。注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。总结:malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。程序例子:# include# includeint main(void){int i = 5; //分配了4个字节 静态分配int * p = (int *)malloc(sizeof(4));//指针变量p为静态分配,malloc开辟的空间为动态分配*p = 5; //*p 代表的就是一个int变量,指针变量p表示是一个以int类型的地址为内容的变量free(p); //freep(p)表示把p所指向的内存给释放掉,p本身的内存是静态的,不能由程序员手动释放//p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 return 0;}扩展资料:malloc在标准库里的代码实现:#define NULL 0#define MEMSEZE 8096typedef double Align;typedef union header{struct {union header* next;unsigned usedsize;unsigned freesize;}s;Align a;}header;static Header mem[MEMSIZE];static Header* memptr=NULL;void* malloc(unsigned nbytes){Header *p,*newp;unsigned nunits;nunits=(nbytes+sizeof(Header)-1)/sizeof(Header)+1;if(memptr==NULL){memptr->s.next=memptr=mem;memptr->s.usedsize=1;memptr->s.freesize=MEMSIZE-1;}for(p=memptr;(p->s.next!=memptr) & (p->s.freesizes.next);if(p->freesizes.usedsize;newp->s.usedsize=nunits;newp->s.freesize=p->s.freesize-nunits;newp->s.next=p->s.next;p->s.freesize=0;p->s.next=newp;memptr=newp;return (void*)(newp+1);}void free(void* ap){Header *bp,*p,*prev;bp=(Header*)ap-1;for(prev=memptr,p=memptr->s.next;(p!=bp) & (p!=memptr);prev=p,p=p->next);if(p!=bp) return;prev->s.freesize+=p->s.usedsize+p->s.freesize;prev->s.next=p->s.next;memptr=prev;}c语言中malloc的意义:malloc就是memory allocate动态分配内存,malloc的出现时为了弥补静态内存分配的缺点,静态分配内存有如下缺点:

1、比如说,传统的一维数组,如int a[5],使用传统的一维数组需要事先指定数组的长度,而且数组的长度必须是一个常量(宏定义的 常量)

2、传统数组(静态分配),不能手动释放,只能等待系统释放,静态分配的变量在该函数内运行的时候有效,当静态分配的变量所在函数运行完之后,该内存会自动释放。静态分配的内存,是在栈中分配的,其实在C语言中的函数调用也是通过栈来实现的,栈这种数据结构的一个特点就是(先进后出)。所以,在调用函数的时候,都是先压入栈中,然后,再从最上面的函数开始执行,最后,执行到main函数结束。动态分配通过malloc分配,是在堆中分配的,堆不是一种数据结构,它是一种排序方式,堆排序。

3、传统数组的长度一旦定义之后,就不能更改,比如说,如果我有一个业务在这之前给分配的大小为100,但是,我现在由于业务数量的增长,原来的大小就无法满足。

4、静态分配不能跨函数调用,就是无法在另一个函数中,来管理一个函数中的内存。静态分配,只在当前函数有效,当,静态分配所在的函数运行完之后,该变量就不能被其他的函数所调用。参考资料:百科-malloc

以下为关联文档:

C语言数据结构与算法分析C语言描述Position不是一个类型,起码C语言中,我写那么多年代码没见过这个类型 。你该把整段代码贴上来。我猜你看的那段代码是伪代码,Position是自定义类型。若Position是类名,那么Positi...

C语言与C语言库函数是什么关系语言就是一种编程语句,它有自己的语法规则,不同的编程语句就是语法规则不同罢了。 所谓C编程就是在编写符合C语法规则的函数,大多数情况下函数都是由程序员自己编写的,但是C本身...

C语言面向对象语言1.设计对象:就是要搞清楚对角包含的数据(属性),如学生对象可能包含学号、姓名、性别、成绩等信息。还要搞清楚对该对象的数据进行的操作有哪些,如:设置类操作Set...(设置姓名、设置...

C学习笔记一 C语言和汇编语言的区别C学习笔记(一) C语言和汇编语言的区别 2016-07-11 09:43 162人阅读 评论(0) 收藏 举报 分类: C学习笔记(13) 版权声明:本文为博主原创文章,未经博主允许不得转载。 C学习笔记(五) C语言...

C语言基础题 c语言高手请进main() { double a=?; double b=?; double c=? double x; doublet delta; delta = b*b-4*a*c if(delta < 0) { printf("无解!\n"); } else if(fabs(delta-1e-20)<0.0) { x=(-b+sq...

C语言入门题来个C语言前辈帮帮#include ain() { float a,b,c,x,s; /*S用来存△的值*/ printf("请输入a ,b , c的值\n"); scanf("&f&f&f\n",&a,&b,&c); /* #include #include ain() { float a,b,c,x,s; /*S用来...

c语言题c语言题while(scanf("%c",&c)!=EOF) { fflush(stdin); scanf("%d%d",&a,&b); if(c=='L') { t=max(a,b); printf("%d\n",t); } else if(c=='S') { t=min(a,b); printf("%d\n",t); } else pri...

c语言 basic语言 c语言都能完成什么功能首先Basic语言是解释型的语言,而C语言是编译型的语言。什么意思呢,就是你编写的Basic语言程序运行的时候需要一个解释器将高级语言代码转为机器码然后才可以执行。C语言程序一...

C语言 C语言 C语言简介C语言 C语言 C语言简介,C语言简介:C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程...

推荐阅读
图文推荐