`

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

 
阅读更多

结构体

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

结构体的定义:

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 ...

    动态内存分配实验报告

    在实际编程中,合理使用动态内存分配可以提高程序的灵活性,但同时也需要警惕内存泄漏和碎片问题。良好的内存管理实践,包括及时释放不再使用的内存,以及适当地使用智能指针,可以帮助避免这些问题。 附录中的代码...

    动态内存分配的实现.pdf

    在计算机科学与编程领域中,动态内存分配是一项核心且复杂的技术,它允许程序在运行时按需请求和释放内存资源,极大地提高了程序的灵活性与效率。本文将深入探讨动态内存分配的实现原理,特别关注《动态内存分配的...

    操作系统动态内存分配实验报告 C++

    动态内存分配允许程序在运行时根据需要请求和释放内存,而非在编译时预设固定的内存大小。这种方式提高了程序的灵活性,但同时也增加了内存管理的复杂性。 在本次实验中,主要目标是理解和实践动态分区分配,这是...

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

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

    C#结构体指针的定义及使用详解

    ### C#结构体指针的定义及使用详解 #### C#结构体指针的基本概念 在C#中,结构体是一种值类型的数据结构,用于封装一组相关的数据。与类不同,结构体不会自动进行垃圾回收,因此对于大量数据的操作效率较高。在...

    动态内存分区分配方式模拟设计

    通过这个模拟设计,我们可以学习到动态内存分配的基本原理和首次适应算法的工作机制。这种模拟可以帮助理解内存管理的复杂性,以及如何有效地分配和回收内存资源,这对于理解和优化程序性能至关重要。在实际操作系统...

    模拟内存申请及释放程序源代码范例1

    6. **错误检查**:在实际编程中,我们需要确保内存分配和释放操作的正确性,这通常包括检查`malloc()`和`realloc()`的返回值,以及避免释放已释放或未分配的内存。 7. **内存池**:模拟程序可能采用了内存池技术,...

    C++数据结构的结构体专题讲解

    以上就是C++中关于结构体专题的主要知识点,其中包括结构体类型变量的定义与初始化、结构体变量的引用方法、结构体数组、指向结构体变量的指针、结构体类型数据作为函数参数的传递方式,以及动态内存分配和释放等...

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

    在调试过程中,`gdb`是一个强大的工具,可以用来检查内存分配情况、查看变量的值以及跟踪程序的执行流程。例如,通过设置断点和使用`p`命令,你可以查看指针变量是否指向了正确的内存地址,以及这些内存区域的内容...

    Delphi new\dispose内存泄露问题解决方案

    首先,`new`和`dispose`是Delphi中用于动态内存分配和释放的关键操作。`new`关键字用于在堆上为对象或类型分配内存,而`dispose`则用于释放之前通过`new`分配的内存。然而,如果没有正确地调用`dispose`,就会导致...

    操作系统实习:动态分区分配(C++实现)

    动态分区分配是操作系统中的一种内存管理机制,通过将内存分配给不同的进程,以满足不同的需求。在这个项目中,我们使用 C++ 语言实现了动态分区分配算法,采用最优适应调度算法来实现动态分区分配。 项目中的主要...

    C#调用C++动态库,执行回调函数并传递结构体参数

    回调函数执行完毕后,C++动态库需要释放分配的内存。 总结来说,这个工程示例展示了C#和C++之间的深度交互,包括P/Invoke调用,回调函数的使用,以及结构体参数的传递。这需要对C#和C++的内存管理、调用约定和数据...

    动态分区分配方式模拟(c语言)

    动态分区分配方式模拟(C语言) 动态分区分配方式模拟是操作...我们使用首次适应算法和最佳适应算法来进行内存分配,提供了一种基本的动态分区分配方式模拟,能够模拟ALLOC()和FREE()过程,用于教学和研究目的。

    C/C++指针引用及动态内存分配详细解析

    动态内存分配允许在程序运行时分配和释放内存。在C++中,使用`new`运算符来分配内存,`delete`运算符来释放内存。例如: ```cpp int *p = new int; // 分配一个整型变量 *p = 5; // 给新分配的内存赋值 delete p; //...

    C语言高级编程(含内存分配,绘制图形,结构体等)

    - **动态内存分配**:通过`malloc()`、`calloc()`、`realloc()`和`free()`函数进行。`malloc()`用于动态分配指定大小的内存,`calloc()`则分配并初始化内存,`realloc()`调整已分配内存的大小,`free()`释放内存。 ...

    C#中调用C++中动态链接库DLL中的结构体

    不过,需要注意的是,频繁的内存分配和释放可能会带来性能开销,所以在设计接口时,尽量减少不必要的数据交换,或者考虑使用更高效的数据传递方式,如引用计数智能指针(如C++11的`std::shared_ptr`)。

Global site tag (gtag.js) - Google Analytics