首页 > 其他分享 >柔性数组——《初学C语言第56天》

柔性数组——《初学C语言第56天》

时间:2024-01-13 22:33:33浏览次数:17  
标签:ps arr struct int 56 C语言 数组 柔性

//////————柔性数组(柔性数组在结构体中只能存在一个)

////C99 中,结构体中的最后一个元素(成员变量)允许是未知大小的数组,这就叫做“柔性数组”成员。

//typedef struct st_type

//{

// int i;

// int a[0];//柔性数组成员

//}type_a;

////有些编译器会报错无法编译可以改成:

//typedef struct st_type

//{

// int i;

// int a[];//柔性数组成员

//}type_a;

////————1 柔性数组的特点:

////1.结构中的柔性数组成员前面必须至少一个其他成员(两个成员及以上)。

////2.sizeof 返回的这种结构体内存大小不包括柔性数组的内存。

////3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大

////  小,以适应柔性数组的预期大小。

//#include<stdio.h>

//struct S

//{

// int i;

// int a[0];//柔性数组成员

//};

//int main()

//{

// int n = sizeof(struct S);//大小不包括柔性数组的大小

// printf("%d\n", sizeof(n));//输出的是4

//  //struct S s;//此时创建的结构体s大小为4字节,只能存n,没有给arr开辟空间,是错误的。

// return 0;

//}

//////————2 柔性数组的使用

////代码1

//#include<stdio.h>

//#include<stdlib.h>

//struct S

//{

// int n;

// int arr[];//柔性数组成员

//};

//int main()

//{

// struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);//40为柔性数组大小

// ps->n = 100;

// int i = 0;

// for (i = 0; i < 10; i++)

// {

//  ps->arr[i] = i;

//  printf("%d\n", ps->arr[i]);

// }

// struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);//ptr指向新开辟的空间时,把ptr赋值给了ps,即他们都指向realloc这块空间,

// if (ptr != NULL)//而free(ptr)就把此块空间给释放了,即ps就会变成野指针

// {

//  ps = ptr;//ptr的确也需要置成NULL;但是ptr赋值给了ps,即duips进行置成NULL即可

// }

// //释放

// free(ps);

// ps = NULL;

// return 0;

//}


////这样柔性数组成员a,相当于获得了100个整型元素的连续空间。

////————3 柔性数组的优势

////上述的 type_a 结构也可以设计为:

////代码2

//#include<stdio.h>

//#include<stdlib.h>

//struct S

//{

// int n;

// int* arr;

//};

//int main()

//{

// struct S* ps = (struct S*)malloc(sizeof(struct S) );//动态开辟结构体S(包含变量n和指针arr)

// //判断

// if (ps == NULL)

// {

//  return 1;//为空指针时,直接返回

// }

// ps->n = 100;//n和arr开辟都放在堆上,所以要让结构体开辟的空间也在堆上,保证设计思路的一致

// ps->arr = (int*)malloc(40);//此时转为int*类型是因为arr为int*

// //判断

// if (ps->arr == NULL)

// {

//  return 1;//为空指针时,直接返回

// }

// //使用

// int i = 0;

// for (i = 0; i < 10; i++)

// {

//  ps->arr[i]=i;

// }

// for (i = 0; i < 10; i++)

// {

//  printf("%d ", ps->arr[i]);

// }

// //扩容

// int* ptr=(int*)realloc(ps->arr,80);

// if(ptr == NULL)

// {

//  return 1;

// }  

// //

// //释放

// free(ps->arr);//先释放结构体中的数组,若先释放结构体,在释放arr,会使arr为野指针。若再不释放arr会导致内存泄漏

// free(ps);

// ptr= NULL;

// return 0;

//}

////上述 代码1 和 代码2 可以完成同样的功能,但是 方法1 的实现有两个好处:

////第一个好处是:方便内存释放

////如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给

////用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你

////不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好

////了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。

////第二个好处是:这样有利于访问速度.

////连续的内存有益于提高访问速度,也有益于减少内存碎片。

标签:ps,arr,struct,int,56,C语言,数组,柔性
From: https://blog.51cto.com/KKhahaha/9233760

相关文章

  • 【C语言】全局变量与局部变量
    在不同的函数之间传递数据时,可以使用如下方法:参数:通过形参和实参返回值:用return语句返回计算结果全局变量全局变量与局部变量全局变量:函数之外定义的变量称为全局变量(外部变量);局部变量:在一个函数内部定义的变量称为局部变量(内部变量)。全局变量使用:#include<stdio.h......
  • CS5569芯片,CS556,设计资料,CS5569规格书,CS5569原理图,typec转HDMI 8K带PD方案
    集睿致远/ASL的CS5269是一款低成本、低功耗的半导体器件,通过USBType-C连接器将DisplayPort信号转换为HDMI2.1。这款创新的基于USBType-C的DisplayPort接收器具有高性能DSC解码器,集成的HDMI2.1发射器专门针对USBType-C到HDMI2.1转换器而设计,一个NG设备。通过CS5269的先进的解码/......
  • 【C语言】模块划分、编译器工作原理
    模块划分在实际应用中,一个较大的C程序并不会把所有代码都放入main主函数中,而是进行模块化设计,每个程序模块作为一个源程序文件,再由若干源程序文件组成一个C程序。这样处理便于分别编写、分别编译、进而提高调试效率。#include<stdio.h>voidfunc1(){//函数声明并定义......
  • RK3568 学习笔记 : 开机上电与串口波特率
    前言开发板:【正点原子】ATK-DLRK3568开发板,包装什么的看上去有点高大上,也有点贵。。开发板资料的Linux-SDK编译通过了,想尝试第一次上电开机,不过,开始出了一点状况,串口信息是乱码,难道【调试串口】数据线有问题?波特率115200bps不正确?调试串口波特率开发板默认有镜像,因此先上电研......
  • RK3568 学习笔记 : 解决 linux_sdk 编译 python 版本报错问题
    前言最近买了【正点原子】的RK3568开发板,下载了开发板的资料,包括LinuxSDK,这个LinuxSDK占用的空间比较大,扩展了一下VM虚拟机ubuntu20.04的硬盘空间,编译才正常通过。编译RK3568LinuxSDK时,遇到python版本的问题,这里做个记录【正点原子】rk3568开发板资料与Lin......
  • VS Code的C语言配置以及使用的傻瓜式教程
    VSCode的C语言配置以及使用的傻瓜式教程写在前面的话作者在学习使用vscode写C代码的时候,根据网上很多参差不齐的教程踩了不少的坑,很多教程在配置完成后总会出现一些普遍性的痛点,所以笔者决定写一篇傻瓜式的教程,帮助大家快速配置vscode,并成功运行C语言代码.作者水平有限,......
  • 【C语言】函数的声明、定义、调用
    函数要先声明后调用!函数的声明和定义函数的声明:把函数的名字、函数类型及形参类型、个数和顺序通知编译系统,以便在调用该函数时编译系统能正确识别函数并检查调用是否合法。函数的定义:对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独......
  • 初识C语言struct关键字
    本人初学C语言,最近学习到了struct,分享以下自己的一些心得。struct是结构体关键字,里面可以包含多个成员,在描述一个复杂结构体时可以借助struct。打印时,“.”可以替代成“->”,即A->name。同时注意struct后是要加;的。#include<stdio.h>structPerson{ charname[10]; shortheigh......
  • 初中英语优秀范文100篇-056I have the courage to accept the challenge-我有勇气接受
    PDF格式公众号回复关键字:SHCZFW056记忆树1Everyyearthereisasingingcompetitioninourschool.翻译每一年,我们学校都会举行一场歌唱比赛。简化记忆比赛句子结构主语("Everyyear"):表示时间状语的短语,意思是“每年”。谓语("thereis"):这是一个therebe句......
  • C/C++程序的内存开辟——《初学C语言第55天》
    //————C/C++程序的内存开辟C++程序内存分配的几个区域://intt=2;//staticintr=1;//voidtest()//{//  statice=1;//  intn=1;//  intarr[10]={1,2,3,4};//  charg[]="helloworld";//  char*p="abcd";//  int*a=(int*)malloc......