结构体、结构体指针的内存申请

    技术2024-10-05  64

    结构体、结构体指针的内存申请

    内存区间

    在c语言中有4个内存区间,分别是代码区、全局变量和静态变量区、堆区和栈区,这四个区间相互扶持成为好兄弟。本文着重涉及堆区,主要针对包括结构体和结构体指针申请内存的过程的分析。 下面是一个结构体和结构体指针的内存从申请到释放的代码

    #define _CRT_SECURE_NO_WARNINGS//vs编译器消除对scanf等函数的安全警告 #include <stdio.h> #include <stdlib.h>//包含malloc函数的头文件 typedef struct student//typedef可以将struct student结构体类型用std替代 { char name[20]; int number; char subject[20]; float scores; }std; int main() { std student1; memset(&student1,0,sizeof(std));//初始化从student1开始的地址到后面sizeof(std)也就是结构体的字节个空间,这些空间都初始化为0也就是空。 printf("name:"); scanf("%s",student1.name);//如果不用memset初始化内存,用scanf语句输入了student1.name的信息再用printf输出是看不出来的,如果不输入直接输出的话就会乱码(原因也是系统内存没有初始化谁也不知道里面本来存的是什么) printf(%s\n",student1.name);//打印一下刚输入的名字 //结构体是直接由栈自动分配指针的所以不需要我们来手动分配和释放内存,而接下来是用结构体指针来申请内存 std* student2 = (std*)malloc(sizeof(std)); if(student2 == NULL//如果申请内存失败,malloc会返回一个NULl { printf("malloc use failure"); return 1;//申请内存失败,错误退出 } memset (student2,0,sizeof(std));//注意这里std不要写成了*std,因为这里需要的是结构体大小,而不是指针,所有指针大小都是4个字节(针对于32位机,64位机为8个字节) printf("name\n"); scanf("%s",student2->name); printf("name:%s\n",student->name); free(student2);//释放指针指向的堆的内存但是不释放指针本身的内存,指针本身存放在栈区,再程序运行结束后才能自动释放 student2 = NULL;//这里就是将指针指向空指针,避免被错误调用 return 0; }

    - 为什么要动态申请内存? 这是因为结构体指针的大小不是一个确定的,要根据我们存放的结构体变量的大小才能分配好空间,所以静态分配满足不了需求,所以采用了动态分配。

    malloc一定要与free一起用,有申请就要有释放,如果没有free或者free用了两次就会出现很严重的错误结构体在c语言学习和数据结构的学习中占了很大的分量,所以要学好数据结构,掌握好这些是必不可少的。
    Processed: 0.012, SQL: 9