`
阿尔萨斯
  • 浏览: 4170465 次
社区版块
存档分类
最新评论

结构体的使用和动态内存的分配及释放

 
阅读更多

结构体

什么是结构体?结构体是用户根据实际需要自己定义的复合数据类型。结构体的出现是为了表示一些复杂的数据,而普通的数据类型无法满足要求。

结构体的定义:

struct Student //struct Student为一个复合数据类型,结构体名字为Student,含有三个成员sno,name,age
{ 
     int sno;
     char name[20];
     int age;
};//分号不能省


实例说明1:

#include<stdio.h>
#include<string.h>
struct Student{
     int sno;
     char name[20];
     int age;
};//分号不能省
int main()
{
	struct Student st,*pst;	
	pst=&st;
	/*第一种方式:结构体变量.成员*/
	st.sno=99;
	strcpy(st.name,"李四");//这里的strcpy(st.name,"李四")是string类型的赋值
	st.age=21;
	printf("%d,%s,%d\n",st.sno,st.name,st.age);
	/*第二种方式:pst指向结构体变量中的sno成员,推荐使用*/
	pst->sno=100;//pst->sno等价于(*pst).sno
	strcpy(pst->name,"王五");
         pst->age=30;
	printf("%d,%s,%d\n",pst->sno,pst->name,pst->age);  
	return 0;
}

实例说明2(通过指针传参(在普通变量的数据类型大于4个字节时)可以节省内存和时间,还可以修改成员变量的值):

#include<stdio.h>
#include<string.h>
struct Student{
	int sno;
	char name[20];
	int age;
};
void input(struct Student *pst);//前置声明
void output(struct Student *pst);
int main()
{
	struct Student st;//定义结构体变量st,同时为st分配内存(此时st占28个字节)	
           input(&st);
	output(&st);
	return 0;
}
void output(struct Student *pst)//完成输出
{
    printf("%d  %s  %d\n",pst->sno,pst->name,pst->age);
}
void input(struct Student *pst)//完成输入
{
	(*pst).sno=100;
	strcpy(pst->name,"张三");
	pst->age=21;
}


注意:

1.结构体在定义时并没有分配内存(它只是一个模型),而是在定义结构体变量时分配内存。

2.结构体变量(如上面的st)不能进行四则运算,但可以相互赋值。

动态内存的分配和释放

使用了malloc()函数的都可以称为动态分配内存。malloc()带一个整型参数

如:int *pArr=(int *)malloc(sizeof(int)*5);

说明:其中的malloc函数只能返回第一个字节的地址(无实际意义),所以要就行强制类型转换,这里加(int *);

动态内存的释放:free(pArr);

说明:把pArr所代表的动态分配的20个字节的内存释放(局部变量在函数内执行完就释放了),跨函数使用内存只能通过动态分配内存来实现。

实例说明(跨函数使用内存):

#include<stdio.h>
#include<malloc.h>
struct Student
{
	int sno;
	int age;
};
struct Student* CreateStudent(void);//void表示该方法不加形参,可不写
void ShowStudent(struct Student *);
int main()
{
    struct Student *ps;  
	ps=CreateStudent();
    ShowStudent(ps);//将ps赋给pst
	return 0;
}
struct Student* CreateStudent(void)
{
	struct Student *p=(struct Student*)malloc(sizeof(struct Student));//为结构体指针变量p动态分配内存
    p->sno=1001;
	p->age=22;
	return p;//把p赋给ps,此时ps指向p所指内存地址
}
void ShowStudent(struct Student *pst)
{
	printf("%d %d\n",pst->sno,pst->age);//通过pst指向结构体变量ps的成员sno、age进行输出成员值
}


分享到:
评论

相关推荐

    动态分配结构体内存(malloc)

    提示:不能使用指针pcarinfo将已分配的内存区域释放,因为此时由于for循环内pcarinfo做自增运算,其所指位置已不再是动态分配内存的首地址了,因此必须使用pcarinfo释放动态分配的内存。 #include #include struct ...

    Vc++6.0Vb6.0WS2010调用Vc写的DLL

    vc++6.0 LoadLibrary方式调用HeapDLL.dll,测试HeapDLL.dll 的对外接口(含int传参、结构体传参、堆内存分配与释放)。 三、VbCallVcDll vb6.0 调用HeapDLL.dll,测试HeapDLL.dll 的对外接口(含int传参、结构体传参、...

    结构体中动态内存的管理(malloc和free)

    C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存的释放。虽然这是我们已经很熟悉的,但是还是存在一些问题。特别是当结构体中存在指针的情况下,各种问题也就...

    内存分配管理练习

    本程序可作为内存分配和管理练习, 熟悉这个程序并能自己写出代码,说明对c++中内存分配和管理有了一定的了解。 程序说明: 采用一个结构体,保存了数据的个数和使用情况(用一个字节 char类型,字节中八个位若为1...

    指针是C语言可以用来直接访问内存地址

    3. 动态内存分配和释放 4. 结构体和链表操作 在C语言中,我们可以使用malloc、calloc和realloc等函数来动态分配内存空间。这些函数返回一个指向分配内存空间起始位置的指针,我们可以通过这个指针来访问和操作这块...

    C语言内存管理与联合结构课件笔记.md

    本课件首先介绍了C语言中的内存管理知识,包括堆栈概念、动态内存分配函数及内存泄漏等问题,并给出了示例代码。然后详细讲解了C语言中的结构体与联合的定义、访问及嵌套使用,每部分都配有代码实例说明。内容结构清晰,...

    静态内存池源代码C++编写

    在分配一小块内存给高层使用时,如果是分配在尾节点去分配的情况,那好办啊,尾节点如果不够分配了就直接从系统去申请一块大内存,节点连起来在分配,这里有可能会浪费掉一小块以结构体大小的一块内存,如果够分配就...

    模拟malloc和free 作业

    定义了一个10M大小的数组,每次分配空间都从这10M中分配,原理是分配的时候空间足够...模拟动态内存分配,模拟malloc和free。 自己的作业,当然也有很多欠缺的地方,比如没有考虑多线程同时调用这类的问题。仅供参考。

    glibc内存管理ptmalloc源代码分析

    2.2 操作系统内存分配的相关函数 2.2.1 Heap操作相关函数 2.2.2 Mmap映射区域操作相关函数 3. 概述 3.1 内存管理一般性描述 3.1.1 内存管理的方法 3.1.2 内存管理器的设计目标 3.1.3 常见C内存管理程序 3.2 ...

    数据结构文档

    数据结构的个人笔记预备知识 指针 结构体 动态内存的分配与释放

    动态分区存储管理方式的算法 最佳适应算法

    (1)程序中有内存分配、释放、显示分区情况、内存整理、退出模块。 (2)采用数据结构为结构体,字段可定义为分区号,分区大小,始址,状态。 (3)初始化内存空间为256K。 (4)采用最佳适应算法。 (5)使用函数...

    C语言基础知识教程、心得、源码示例讲解文档

    6.动态内存管理: 理解动态内存分配、内存释放等概念。 7.文件操作: 熟悉文件创建、写入、读取、关闭等操作。 8.结构体和联合: 了解什么是结构体和联合以及如何使用它们。 9.C语言中的预处理: 了解预处理器如何工作...

    课题研究主要功能目标 本项目的主要目标是开发一个简易的观众投票系统,用于模拟电视大赛中的观众投票过程

    • 动态内存管理:通过malloc和free进行动态内存分配和释放,以便根据选手数量灵活地存储数据。 • 排序算法:实现快速排序和冒泡排序算法,用于对选手的得票数进行排序。 • 基本的输入输出(I/O)操作:使用cin和...

    VC编程时CPU中参数的传递的方法与总结

    该压缩包括一个记事本文件,一个Word文件和一个VS2017的工程,本项目是通过CPU中指针,结构体,数组的传递,详细讲解了CPU参数传递过程中分配内存,释放内存和使用的相关问题。

    C语言进阶语法与编程技巧.md

    2.1 动态内存分配 2.2 内存释放 文件操作 3.1 打开与关闭文件 3.2 读写文件内容 字符串处理 4.1 字符串的基本操作 4.2 字符串库函数 预处理指令与宏 5.1 #include与#include_once 5.2 宏的定义与使用 多文件程序 6.1...

    可变分区存储-循环首次适应法

    使用双向链表的数据结构,用C语言成功实现了可变分区存储管理中的循环首次适应法,实现了对内存区的分配和释放管理。并且考虑了很多分配和释放内存区时的错误,如分配时内存不足,释放越界,重复释放等问题,并给出...

    数据结构教材教程及答案

    数据结构教材及课后答案,实验,1 输入与输出 2 预定义常量 3 函数 4 结构体 5 引用 6 指针 7 内存动态分配与释放 8 枚举 9 类型定义(typedef)

    C++智能指针详解(1).pdf

    动态内存管理经常会出现两种问题: (1)⼀种是忘记释放内存,会造成内存泄漏; (2)⼀种是尚有指针引⽤内存的情况下就释放了它,就会产⽣引⽤⾮法内存的指针。 为了更加容易(更加安全)的使⽤动态内存,引⼊了...

    TensorFlow内存管理bfc算法实例

    它具有内存分配、释放、碎片管理等基本功能。 2. bfc基本算法思想 1. 数据结构 整个内存空间由一个按基址升序排列的Chunk双向链表来表示,它们的直接前趋和后继必须在地址连续的内存空间。Chunk结构体里含有实际大小...

    C学习深入学习总结

    7.2 什么情况下使用动态分配内存? 10 7.3 动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具? 10 8 字符串 10 8.1 strlen()函数的返回值是什么类型的? 10 8.2 字符串strlen() 的值,是否和他...

Global site tag (gtag.js) - Google Analytics