搜档网
当前位置:搜档网 › c语言malloc函数的使用

c语言malloc函数的使用

c语言malloc函数的使用
c语言malloc函数的使用

C语言malloc的使用浅谈

参考文献:C_Free API文档

在c语言的编程中常常要对内存操作,而这对不少人来说是个不简单的问题。

最近在做作业的过程中常常看到在用到存储结构的地方常常有malloc的身影,我就在想到底什么时候什么地方该用到malloc 经过在百度和狗狗的一番搜搜之后在下的愚见总结如下:一、使用malloc的情况

首先说明一下,由malloc动态申请的内存空间是堆式的内存空间。

而静态的内存的空间是栈式的。有关堆栈的知识请参考其他相关资料。

1.大容量内存需求

网上说当我们需要的内存空间超过0.5兆的时候最好使用动态内存,也就是利用

malloc来申请内存空间。可以这么认为,如果内存过大,就会不易管理,而malloc

可以说事一个专业的内存管理者,但静态的则可以当成是一个业余的。毕竟术业有

专攻。

2.不确定内存需求

当我们需要的内存空间大小连我们自己也不知道的时候。为了不使内存空间的浪费。

我们需要用到malloc函数。可以这样理解如果说静态的内存空间是一个铁盒子的话

那么动态内存空间就可以看作是可伸缩的袋子,它的容量可以根据你所装物体的体

积不同而定制。当然我们也可以利用静态内存,这样会有两种可能出现的结果,一

是你所申请的空间不够用,程序异常。二是申请的内存过大,浪费。

3.备注

二、如何科学使用malloc

1.申请

calloc

功能:函数返回一个指向num数组空间,每一数组元素的大小为size。

如果错误发生返回NULL。

malloc

功能:函数指向一个大小为size的空间,如果错误发生返回NULL。存储空间的指针必须为堆,不能是栈。这样以便以后用free函数释放空间。例如:

typedefstructdata_type {

int age;

char name[20];

} data;

data *bob;

bob = (data*) malloc( sizeof(data) );

if( bob != NULL ) {

bob->age = 22;

strcpy( bob->name, "Robert" );

printf( "%s is %d years old\n", bob->name, bob->age );

}

free( bob );

realloc

功能:函数将ptr对象的储存空间改变为给定的大小size。参数size可以是任意大小,大于或小于原尺寸都可以。返回值是指向新空间的指针,如果错误发生返回NULL。

2.释放

free

功能:函数释放指针ptr指向的空间,以供以后使用。指针ptr必须由先前对malloc(), calloc(), realloc()的调用返回。例如:

typedefstructdata_type {

int age;

char name[20];

} data;

data *willy;

willy = (data*) malloc( sizeof(willy) );

...

free( willy );

C语言中指针和数组名的用法,结构体与共用体的总结

C语言中指针和数组名的用法,结构体与共用体的总结 2010-01-11 19:38 在C语言中,指针和数组名通常都可以混用。 例如 char *p; 访问时,*p跟p[0]是一样的,*(p+1)跟p[1]是一样的。 对于数组 char b[5]; 访问时,b[0]跟*b是一样的,b[2]跟*(b+2)是一样的。 在一般的通信中(例如串口),通常都使用字节传输。而像float,long int 之类的, 有4字节。我的方法就是取它的地址,强制转换为char型指针,然后当作数组来用。 float x; SBUF=((char*)&x)[0]; SBUF=((char*)&x)[1]; SBUF=((char*)&x)[2]; SBUF=((char*)&x)[3]; 接收时,刚好倒过来。 更有趣的是,对于数组形式,数组名和后面的偏移量可以随便换。 char buff[10]; //或者用 char *buff=&buffer; buff[3]=0xaa; 3[buff]=0xaa; //两者是一样的 因此,我认为编译器是这么做的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy), 因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了... c语言结构体与共用体学习笔记1 Author:yuexingtian Date:Thursday, June 12, 2008 1结构变量的赋值 测试结果:

{ struct stu { int num; char *name; char sex; float score; }boy1,boy2; boy1.num=15; https://www.sodocs.net/doc/f118622641.html,="yuexingtian"; printf("input sex and score\n"); scanf("%c %f",&boy1.sex,&boy1.score); boy2=boy1; printf("Number=%d\nName=%s\n",boy2.num,https://www.sodocs.net/doc/f118622641.html,); printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score); getch(); } 说明: 本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。最后分别输出boy2的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。 2结构变量的初始化 对结构变量的初始化(还拿上例举例)

c语言中函数malloc的用法

c语言中函数malloc的用法 c语言中函数malloc的用法的用法如下:一、malloc()和free()的基本概念以及基本用法:1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。 如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该有多种,比如说空间不足就是一种。 void free(void *FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 2、函数的用法:其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:// Code...char *Ptr = NULL;Ptr = (char *)malloc(100 * sizeof(char));if (NULL == Ptr){exit (1);}gets(Ptr);// code...free(Ptr);Ptr = NULL;// code...就是这样!当然,具体情况要具体分析以及具体解决。 比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。 3、关于函数使用需要注意的一些地方:A、申请了内存空间后,必须检查是否分配成功。 B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

C、这两个函数应该是配对。 如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。 释放只能一次,如果释放两次及两次以上会 D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。 二、malloc()到底从哪里得来了内存空间:1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。 也就是说函数返回的指针是指向堆里面的一块内存。 操作系统中有一个记录空闲内存地址的链表。 当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。 就是这样!说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。 什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。 全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。 堆在操作系统对进程初始化的时候分配,运行过程中也可以向系

C语言高级编程及实例剖析

C语言高级编程及实例分析 第一章:内存管理 c语言对程序精心编译时,将函数中命令、语句编译成相应序列的机器指令代码,放在代码段;将已初始化的数据,如已赋值的全局变量、静态局部变量等,放在数据段;将未初始化的数据放在BBS段内;将临时数据,如函数调用时传递的参数、局部变量、返回调用时的地址等放在栈段内;而对一些动态变化的数据,如在程序执行中建立的一些数据结构,如链表,动态数组等,则放在堆结构中。 内存管理系统是操作系统的重要部分。C语言中使用malloc()函数和free()函数来分配和释放内存。再次释放已经释放的内存和释放未被分配的内存都会造成系统的崩溃。 1.1.1PC存储器结构 PC机存储器结构分为主存储器、外存储器和高速缓存几个部分。 1.1.4 内存编译模式 编译模式是指如何在内存中放置程序代码及数据,如何分配堆栈,并确认占用的内存大小及如何存取它们,当指定内存模式以后,语言编译程序将按事先选择好的内存模式编译组织程序。C语言提供了6种编译模式,分别是:微模式,小模式,紧凑模式,中模式,大模式和巨模式。 1.1.5 堆概念和结构 堆是一种动态的存储结构(存储链表,动态数组等),实际上就是数据段的自由存储区。 1.1.6 堆管理函数 1.malloc()函数 用来分配内存。函数原型为void *malloc(unsigned size) 如:int *p;

P= (int*)malloc(sizeof(int)); 如果要分配100个int型的空间时,表示为:int *p=(int*)malloc (sizeof(int)); 2.free()函数 用来释放内存。函数原型为void *free(指针变量) 如:int *p=(int *)malloc(4); *p=100; free(p); 3.realloc()函数 用来重调空间的大小,函数声明为:void *realloc(void *block,int size); block是指向要扩张或缩小的内存空间的指针。Size指定新的大小。 4.calloc()函数 用来分配一个能容纳n个元素,每个元素长度为size的内存空间。函数声明为void *calloc (size_t nelem,size_t elsize)。该函数将分配一个容量为nelem *size大小的空间,并用0初始化该内存区域,即每个地址装入0.该函数将返回一个指向分配空间的指针。如果没有空间可用,则返回NULL指针。若在大数据模式下建立远堆,则可用farmalloc函数。 1.2.2 函数剖析 1 函数init_Heap() 实现了初始化内存分配程序的功能 2函数My_Free() 完成函数释放内存的功能 3函数Allocate()

C语言中不同的结构体类型的指针间的强制转换详解

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在结构体中的偏移地址。 变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位值,并且存储在某个内存单元中,通过这个32位值就能找到param所指向的结构的起始地址,通过这个起始地址和各个结构所包含变量离起始地址的偏移对这些变量进行引用, param->bIsDisable只是这种引用更易读的写法,只要param是指向 PAINT_PARAM的指针,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要记住,param->bIsDisable只是代表了对param一定偏移地址的值。 不是说某个地址有那个结构体你才能引用,即使没有,你也能引用,因为你已经告诉了编译器param变量就是指向一个PAINT_PARAM结构体的变量并且指明了param的值,机器码的眼中是没有数据结构一说的,它只是机械的按照 指令的要求从内存地址取值,那刚才的例子来说,peg->x,peg->y的引用无论 0x30000000是否存在一个eg结构体都是合法的,如果0x30000000开始的8 个字节存在eg结构体,那么引用的就是这个结构体的值,如果这个位置是未定义的值,那么引用的结果就是这8个字节中的未定义值,内存位置总是存在的,而对内存中值的引用就是从这些内存位置对应的内存单元取值。 举个例子: typedefstruct_eg { int x; int y; }eg;

c语言中free的用法如何工作.doc

c语言中free的用法如何工作c语言中free的用法:malloc()和free() 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该有多种,比如说空间不足就是一种。 void free(void *FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 2、函数的用法: 其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子: 程序代码: // Code... char *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); if (NULL == Ptr) { exit (1); } gets(Ptr);

// code... free(Ptr); Ptr = NULL; // code... 就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。 3、关于函数使用需要注意的一些地方: A、申请了内存空间后,必须检查是否分配成功。 B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。 C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会 出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。 D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一 些编译器的检查。 好了!最基础的东西大概这么说!现在进入第二部分: c语言中free的用法:malloc()到底从哪里得来了内存空间 1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。

C语言入门教程-指向结构体的指针

C语言入门教程-指向结构体的指针 2009年07月29日12:04 [导读] 指向结构体的指针 在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型。创建结构体指针是极常见的。下面是一个例子: typedef struct{

关键词:c语言入门 指向结构体的指针 在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型。创建结构体指针是极常见的。下面是一个例子: typedef struct

{char name[21];char city[21];char state[3];} Rec; typedef Rec *RecPointer; RecPointer r; r=(RecPointer)malloc(sizeof(Rec)); r是一个指向结构体的指针。请注意,因为r是一个指针,所以像其他指针一样占用4个字节的内存。而malloc语句会从堆上分配45字节的内存。*r是一个结构体,像任何其他Rec类型的结构体一样。下面的代码显示了这个指针变量的典型用法:

strcpy((*r).city, "Raleigh"); strcpy((*r).state, "NC"); printf("%sn", (*r).city); free(r); 您可以像对待一个普通结构体变量那样对待*r,但在遇到C的操作符优先级问题时要小心。如果去掉*r两边的括号则代码将无法编译,因为“.”操作符的优先级高于“*”操作符。使用结构体指针时不断地输入括号是令人厌烦的,为此C语言引入了一种简记法达到相同的目的:

r->这种写法和(*r).是完全等效的,但是省去了两个字符。 指向数组的指针 还可以创建指向数组的指针,如下所示:

free函数和malloc函数

malloc 原型:extern void *malloc(unsigned int num_bytes); 用法:#include 或#include 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。 malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针. 举例: // malloc.c #include #include main() { char *p; clrscr(); // clear screen p=(char *)malloc(100); if(p) printf("Memory Allocated at: %x",p); else printf("Not Enough Memory!\n"); if(p) free(p); getchar(); return 0; } malloc()函数的工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个

globalalloc、malloc和new的区别

GlobalAlloc是为了与Win16兼容才保留的,在Win32下不要使用。全局内存对象使用GlobalAlloc函数分配,在Windows 3.X 的时代,分配的内存可以有两种,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的时代这些函数已经被废弃了,现在的内存只有一种就是虚存。在Win32中所有的进程所使用的内存区域是相互隔离的,每个进程都拥有自己的地址空间。而且系统使用了页面交换功能,就是利用磁盘空间来模拟RAM,在RAM中数据不使用时将会被交换到磁盘,在需要时将会被重新装入RAM。 两者都是在堆上分配内存区。 malloc()是C运行库中的动态内存分配函数,WINDOWS程序基本不使用了,因为它比WINDOWS内存分配函数少了一些特性,如,整理内存。 GlobalAlloc()是16位WINDOWS程序使用的API,返回一个内存句柄,在实际需要使用时,用GlobalLock()来实际得到内存区。但,32位WINDOWS系统中,应使用新的内存分配函数HeapAlloc()以得到更好的支持,GlobalAlloc()还可以用,主要是为了兼容。 HeapAlloc apply memory from kernel32.dll GlobalAlloc obsolete malloc apply memory form C runtime memory ,and C r untime applys from kernel32.dll new a wrapper of malloc but it is NOT a must for new to implement based on malloc. CoMemAlloc apply memory from kernel32.dll all are heap memory. recommend HeapAlloc for big block memory allocation recommend stack memory space. recommend HeapAlloc for big block memory allocation recommend stack memory space. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例7-8。 class Obj{ public : Obj(){ cout << “Initialization” << endl; } ~Obj(){ cout << “Destroy” << endl; } void Initialize(){ cout << “Initialization” << endl; } void Destroy(){ cout << “Destroy” << endl; } }; void UseMallocFree(){ Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存

C语言复习题指针结构体

C语言复习题_指针&结构体 一、选择 1、若有以下定义:char s[20]="programming",*ps=s; 则不能代表字符'o'的表达式是A。 A) ps+2 B) s[2] C) ps[2] D) ps+=2,*ps 2、若有以下定义和语句: int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示a数组元素的表达式是B。 A) *p B) a[10] C) *a D) a[p-a] 3、已知int *p,a; p=&a; 这里的运算符& 的含义D。 A) 位与运算B) 逻辑与运算C) 取指针内容D) 取变量地址 4、定义结构体如下: struct student { int num; char name[4]; int age; }; 则printf(“%d”,sizeof(struct student))的结果为: 12。 5、若有定义如下:int i=3,*p=&i; 显示i的值的正确语句是B。 A) printf(“%d”,p); B) printf(“%d”,*p); C) printf(“%p”,*p); D) printf(“%p”,p); 6、在定义结构体时,下列叙述正确的是A。 A) 系统不会分配空间 B) 系统会按成员大小分配空间 C) 系统会按最大成员大小分配空间 D) 以上说法均不正确 7、指针是一种D。 A) 标识符B) 变量C) 运算符D) 内存地址 8、定义struct s {int x; char y[6];} s1;,请问正确的赋值是C。 A) s1.y=”abc”; B) s1->y=”abc”; C) strcpy(s1.y,”abc”); D) s1.strcpy(y,”abc”); 9、已知定义“int x =1, *p”,则合法的赋值表达式是A。 A) p =&x B) p = x C) *p =&x D) *p =*x

动态存储分配

动态存储分配在此之前,我们用于存储数据的变量和数组都必须在说明部分进行定义。C编译程序通过定义语句了解他们所需存储空间的大小,并预先为其分配适当的空间。这些空间一经分配,在变量或数组的生存期内是固定不变的。故称这种分配方式为“静态存储分配”。C语言中还有一种称作“动态存储分配”的内存空间分配方式:在程序执行期间需要空间来存储数据时,通过“申请”分配指定的内存空间;当有闲置不用的空间时,可以随时将其释放,由系统另作它用。用户可通过调用C语言提供的标准库函数来实现动态分配,从而得到指定数目的内存空间或释放指定的内存空间。ANSI C标准为动态分配系统定义了四个函数,它们是:malloc、calloc、free和realloc。使用这些函数时,必须在程序开头包含文件stdib.h。本节只介绍malloc、calloc和free函数的使用。1、malloc函数和free函数(1)malloc函数ANSI C标准规定malloc函数返回值的类型为void *,函数的调用形式为:malloc (size)。要求size的类型为unsigned int。malloc函数用来分配size个字节的存储区,返回一个指向存储区首地址的基类型为void的地址。若没有足够的内存单元供分配,函数返回空(NULL)。假设int型数据占2字节,float型数据占4字节存储单元,以下程序段将使pi指向一个int类型的存储单元,使pf指向一个float类型的存储单元。int *pi;float *pf;pi=(int *)malloc(2);pf=(float *)malloc(4);由于在ANSI C中malloc函数返回的地址为void *(无值型),故在调用函数时,必须利用强制类型转换将其转换成所需的类型。此处括号中的*号不可少,否则就转换成普通变量类型而不是指针类型了。若有以下语句段:if(pi!=NULL) *pi=6;if(pf!=NULL) *pf=3.8;赋值后数据的存储单元情况如图7.2所示。 pi pf图7.2由动态分配得到的存储单元没有名字,只能靠指针变量来引用它。一旦指针改变指向,原存储单元及所存储数据都将无法再引用。通过调用malloc函数所分配的动态存储单元中没有确定的初值。若不能确定数据类型所占字节数,可以使用sizeof运算符来求得。例如:pi=(int *) malloc(sizeof(int));pf=(float *) malloc(sizeof(float));这是一种常用的形式。它由系统来计算指定类型的字节数。(2)free函数函数的调用形式为:free(p);这里指针变量p必须指向由动态分配函数malloc分配的地址。free函数将指针p所指的存储空间释放,使这部分空间可以由系统重新支配。此函数没有返回值。2、calloc函数ANSI C 标准规定calloc函数返回值的类型为void *,函数的调用形式为:calloc(n,size);要求n和size的类型都为unsigned int。calloc函数用来给n个同一类型的数据项分配连续的存储空间。每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空。由调用calloc函数所分配的存储单元,系统自动置初值0。例如:char *ps;ps=(char *)calloc(10,sizeof(char));以上函数调用语句开辟了10个连续的char类型的存储单元,由ps指向存储单元的首地址。每个存储单元可以存放一个字符。显然,使用calloc函数动态开辟的存储单元相当于开辟了一个一维数组。函数的第一个参数决定了一维数组的大小;第二个参数决定了数组元素的类型。函数的返回值就是数组的首地址。使用calloc函数开辟的动态存储单元,同样用free函数释放。

二级c常用函数总结(1)

***************数学相关**************** 1、函数名称: abs 函数原型: int abs(int x); 函数功能: 求整数x的绝对值 函数返回: 计算结果 参数说明: 所属文件: <>,<> 使用范例: #include <> #include <> int main() { int number=-1234; printf("number: %d absolute value: %d",number,abs(number)); return 0; } 2、函数名称: fabs 函数原型: double fabs(double x); 函数功能: 求x的绝对值. 函数返回: 计算结果 参数说明: 所属文件: <> 使用范例: #include <> #include <> int main()

{ float number=; printf("number: %f absolute value: %f",number,fabs(number)); return 0; } 3、函数名称: sqrt 函数原型: double sqrt(double x); 函数功能: 计算x的开平方. 函数返回: 计算结果 参数说明: x>=0 所属文件: <> 使用范例: #include <> #include <> int main() { double x=,result; result=sqrt(x); printf("The square root of %lf is %lf",x,result); return 0; } 4、函数名称: pow 函数原型: double pow(double x,double y); 函数功能: 计算以x为底数的y次幂,即计算x^y的值. 函数返回: 计算结果

c语言结构体指针初始化===

c语言结构体指针初始化 今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗 那时我不知怎么的想不出理由,虽然我还是坚信要初始化的 过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针) 那时在忙着整理文档,没在意 今天抽空调了一下,结论是,还是需要初始化的。 而且,不写代码你是不知道原因的(也许是对着电脑久了IQ和记性严重下跌吧) 测试代码如下 1.#include 2.#include 3.#include 4. 5.struct student{ 6.char *name; 7.int score; 8.struct student* next; 9.}stu,*stu1; 10. 11.int main(){ 12. https://www.sodocs.net/doc/f118622641.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ 13. strcpy(https://www.sodocs.net/doc/f118622641.html,,"Jimy"); 14. stu.score = 99; 15. 16. stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ 17. stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ 18. stu.next = stu1; 19. strcpy(stu1->name,"Lucy"); 20. stu1->score = 98; 21. stu1->next = NULL; 22. printf("name %s, score %d \n ",https://www.sodocs.net/doc/f118622641.html,, stu.score); 23. printf("name %s, score %d \n ",stu1->name, stu1->score); 24. free(stu1); 25.return 0; 26.} #include #include #include struct student{ char *name; int score; struct student* next; }stu,*stu1; int main(){ https://www.sodocs.net/doc/f118622641.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ strcpy(https://www.sodocs.net/doc/f118622641.html,,"Jimy"); stu.score = 99; stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ stu.next = stu1; strcpy(stu1->name,"Lucy"); stu1->score = 98; stu1->next = NULL; printf("name %s, score %d \n ",https://www.sodocs.net/doc/f118622641.html,, stu.score);

malloc与new函数详解

malloc与new函数详解 热3已有1433 次阅读2009-07-20 08:32 malloc函数 原型:extern void *malloc(unsigned int num_bytes); 用法:#include 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。 举例: // malloc.c #include #include main() { char *p; clrscr(); // clear screen p=(char *)malloc(100); if(p) printf("Memory Allocated at: %x",p); else printf("Not Enough Memory!\n"); free(p); getchar(); return 0; } 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 从函数声明上可以看出。malloc 和new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如: int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为sizeof(int); 或: int* parr; parr = new int [100]; //返回类型为int* 类型(整数型指针),分配大小为sizeof(int) * 100;

c语言练习题7(指针与结构体,有答案)

1、下列程序的运行结果是_B______。 void fun(int *a,int *b) { int *k: k=a;a-b;b=k; } main() { int a=3,b=6,*x=&a,*y=&b; fun(x,y); printf[”%d%d.f,a,b); } A)6 3 B)36 C)编译出错 D)0 0 PS:本题中主函数里的x、y,fun函数里的a、b、k,这些都是指针,fun函数中只是将a、b这两个指针交换了位置,而并没有改变主函数中变量a、b的值。 2、若有定义:int*p[3];,则以下叙述中正确的是____B____。 A)定义了一个基类型为int的指针变量p,该变量有三个指针 B)定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针 C)定义了一个名为+p的整型数组,该数组含有三个int类型元素 D)定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素 PS:由于运算符[]优先级比*高,int*p[3];相当于int *(p[3]);表示数组p 的三个元素都是指针变量,且每个元素都是基类型为int的指针。 3、有以下程序:

void swapl(int *a,int *b) {int *c=a; a=b,b=c; } void swap2(int *a,int *b) { int c=*a: *a=*b,*b=c; } main() (int a=lO,b=15; swapl(&a,&b); printf(”%d,%d,”,a,b); a=lO,b=15; swap2(&a,&b); printf(”%d,%dt.,a,b); } 其输出结果为_10,15,15,10___。 A)15,10,10,15 B)15,10,15,10 C)10,15,10,15 D)10,15,15,10 PS:C语言规定,实参变量对形参变量的数据传递是“值传递”,只由实参传给形参,而不能由形参传回来给实参。在内函数调用结束后,形参单元被释放,实参单元仍保留并维持原值。本题中swapl()函数中,虽然改变了形参指针的值,但实参指针的值并没有改变,所以执行第一个printf后应输出10,15,;swap2()函数实现了交换两个变量a和b的值,因此执行第二个printf后输出交换后的值15,10,所以本题答案为D。

C语言实验报告之指针、结构体等综合程序设计

一、实验的目的、要求及内容 1、通过实验掌握指针的概念,学会定义和使用指针变量。 2、能正确使用数组的指针和指向数组的指针变量。 3、能正确使用字符串指针和指向字符串的指针变量。 4、掌握结构体类型变量的定义和使用。 二、算法设计思想及内容 本实验主要完成指针和结构体的应用训练,总共要求完成三个问题的源代码的编辑、编译、连接与运行,最终产生相关的运行结果,按规定要求提交相应的实验报告。具体要求完成的问题如下: 1、采用指针方式编写程序输入10个整数,将其中最小的数与第一个数对换,把最 大的数与最后一个数对换。写3个函数:(1)输入10个数;(2)进行处理;(3) 输出处理后的10个数。 2、采用指针方式在主函数中输入字符串,在函数中求出字符串的长度,然后输出求 出的长度。 3、有5个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入5个 学生的数据,要求输出3门课程的总平均成绩,以及最高分数的学生的数据(包 括学号、姓名、3门课的成绩、平均分)。 三、所使用的软硬件平台 软件平台:Microsoft Windows XP专业版SP3,Microsoft Visual C++ 6.0。 硬件平台:联想系列,Intel(R)Core(TM)i3,CPU 3.20Ghz,2.99GB内存,550GB硬盘。 四、源程序代码 1.#include int main() {int a[10]; void shuru(int a[10]); void chuli(int a[10]); void shuchu(int a[10]); printf("请输入10个数:"); shuru(a); chuli(a); printf("输出处理后的10个数为:"); shuchu(a); printf("\n"); return 0; }

c++入门及c++各种有用函数库

简介 stdlib 头文件即standard library标准库头文件 stdlib 头文件里包含了C、C++语言的最常用的系统函数 该文件包含了的C语言标准库函数的定义 stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、 realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit() 等等。具体的内容你自己可以打开编译器的include目录里面的stdlib.h头 文件看看。 stdlib.h包含函数 输入样式:C语言模式:#include C++样式:#include 1函数名称: calloc 函数原型: void * calloc(unsigned n,unsigned size); 函数功能: 分配n个数据项的内存连续空间,每个数据项的大小为size 函数返回: 分配内存单元的起始地址,如果不成功,返回0 2函数名称: free 函数原型: void free(void* p); 函数功能: 释放p所指的内存区 函数返回: 参数说明: p-被释放的指针 3函数名称: malloc 函数原型: void * malloc(unsigned size); 函数功能: 分配size字节的存储区 函数返回: 所分配的内存区地址,如果内存不够,返回0 4函数名称: realloc 函数原型: void * realloc(void * p,unsigned size); 函数功能: 将p所指出的已分配内存区的大小改为size,size可以比原来分配 的空间大或小 函数返回: 返回指向该内存区的指针.NULL-分配失败 5函数名称: rand 函数原型: int rand(void); 函数功能: 产生0到32767间的随机整数(0到0x7fff之间)

大连东软信息学院C语言实验七指针与结构体分析

实验七指针与结构体 一、实验目的 1.掌握指针和指针变量的概念。 2.掌握简单指针变量的定义和基本使用方法。 3.熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。 4.了解指针和二维数组的关系,了解用指针表示二维数组元素的方法。 5.了解指针与字符串的关系,能熟练使用指针处理字符串。 6.掌握结构体类型变量的定义和使用; 二、实验预习 1.理解为什么要引入指针,引入指针是为了解决什么问题。指针和地址之间的关系是什么? 2.指针和指针变量有什么区别? 3.如何理解指针的类型和变量空间存储数值的类型之间的对应关系?当指针自增时,跳过的地址为多少,与什么因素有关? 4.理解指向数组的指针与数组名之间的联系与区别?数组名可以通过自增来实现地址空间的变化吗? 5.指向数组的指针和指针数组之间有什么样的区别,在定义的时候如何区分? 6.理解为什么要引入结构体?结构体类型和结构体变量分别指什么? 三、实验内容 (一)阅读并调试下列程序,根据要求给出程序结果。 1.用指针访问简单变量。 ⑴ 编程分析 定义指向整型变量的指针变量,然后通过“*指针变量”的形式即可访问相应的简单变量。 ⑵ 参考程序 /* 用指针访问简单变量的程序 */ #include "stdio.h" void main() { int a,b,c,temp; int *p1,*p2,*p3; printf("请输入三个整数值(a,b,c):\n"); scanf("%d,%d,%d",&a,&b,&c); p1=&a; /* 使指针p1指向简单变量a */ p2=&b; /* 使指针p2指向简单变量b */ p3=&c; /* 使指针p3指向简单变量c */ if(*p1<*p2) { temp=*p1;*p1=*p2;*p2=temp; } if(*p1<*p3) {

南昌大学FreeRTOS实验5-8知识点

实验5-8知识点 实验5:时间片调度/任务信息状态查询与统计 实验6:信号量 实验7:软件定时器/事件标志组 实验8:任务通知 回答下列问题时,尽量通过读代码得到答案,这有助于你理解和记住代码。 1.《11-1 FreeRTOS任务状态或信息查询实验》 本实验同时用到了TIM3和TIM5。TIM5可以换成TIM4。但是,如果我们想把这一实验和以前的实验合并成一个工程时,TIM3/TIM4和实验6-1中断测试实验冲突,这个该如何解决?给出思路即可。 ?? uxTaskGetNumberOfTasks函数的作用和用法? P156获取当前系统中存在的任务的个数 uxTaskGetSystemState函数的作用和用法? P151获取系统中任务状态 uxTaskGetSystemState中的TaskStatus_t结构体的成员变量有哪些? 作业20180521/1: typedef struct xTASK_STATUS { TaskHandle_t xHandle; //任务句柄 const char *pcTaskName; //任务名字 UBaseType_t xTaskNumber; //任务编号 eTaskState eCurrentState; //当前任务状态 UBaseType_tuxCurrentPriority; //任务当前优先级 UBaseType_t uxBasePriority; //任务基础优先级 uint32_t ulRunTimeCounter; //任务运行的总时间 StackType_t *pxStackBase; //堆栈基地址 uint16_tusStackHighWaterMark; //从任务创建以来任务堆栈剩余的最小大小

相关主题