C语言编程C++柔性数组结构示例讲解

目录
  • 绕指柔—柔性数组
    • 柔性数组的特点:
    • 第一个好处是:方便内存释放
    • 第二个好处是:这样有利于访问速度
    • 总结

绕指柔—柔性数组

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构体中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员。

柔性数组的特点:

1.结构中的柔性数组成员前面必须至少一个其他成员。

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

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

那我们如何使用呢

法一

#include<stdio.h>
#include<stdlib.h>
struct S
{
	int a;
	int arr[];//未知大小 柔性数组成员  数组的大小是可以调整的
};
int main()
{
	//我们怎么开辟呢
	//包含柔性数组成员的结构体的使用,要配合malloc这样的动态内存分配内存函数使用
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
	//我们如何使用呢
	ps->a = 100;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	//还想扩大呢
	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 10 * sizeof(int));//先交给ptr,防止内存调整失败
	if (ptr == NULL)//判断是否开辟成功
	{
		printf("扩容失败\n");
		return 0;
	}
	else
	{
		ps = ptr;
		for (int i = 5; i < 10; i++)
		{
			ps->arr[i] = i;
		}
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", ps->arr[i] = i);
		}
		//用完就释放
		free(ps);
		ps = NULL;
	}
	return 0;
}

法二

#include<stdio.h>
#include<stdlib.h>
struct S
{
	int a;
	int* parr;
};
int main()
{
	//我们怎么开辟呢
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	//我们如何使用呢
	ps->a = 100;
	ps->parr = (int*)malloc(5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->parr[i] = i;
	}
	//还想扩大呢
	int* ptr = (int*)malloc(10 * sizeof(int));//先交给ptr,防止内存调整失败
	if (ptr == NULL)//判断是否开辟成功
	{
		printf("扩容失败\n");
		return 0;
	}
	else
	{
		ps->parr = ptr;
		for (int i = 5; i < 10; i++)
		{
			ps->parr[i] = i;
		}
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", ps->parr[i] = i);
		}
		//用完就释放
		free(ps->parr);
		ps->parr = NULL;
		free(ps);
		ps = NULL;
	}
	return 0;
}

那上面那个方法好一点呢

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

如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。

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

连续的内存有益于提高访问速度,也有益于减少内存碎片。(其实,我个人觉得也没多高了,反正你跑不了要用做偏移量的加法来寻址)

总结

第一种好,不好的话,要柔性数组干吗?是不是
何意百炼刚,化为绕指柔

首先说明一下我不软弱,只是单纯觉得这句诗好玩,我不认为这首诗是软弱的诗我有自己的见解。说软弱的只能说不要你想的就是你想的。

以上就是C语言编程之柔性数组示例讲解的详细内容,更多关于C语言柔性数组的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言编程之动态内存与柔性数组的了解

    目录 介绍动态内存分配函数 常见的动态内存开辟的错误 举个例子 柔性数组 柔性数组的特点 创建变量 1,局部变量–栈区 2,全局变量–静态区 创建数组 1,局部数组–栈区 2,全局数组–静态区 介绍动态内存分配函数 malloc free calloc realloc 所有的动态内存分配,都是在堆中进行分配 分别介绍动态内存函数 malloc void* malloc(size_t size) 向内存堆中申请size个字节,并返回该空间的首地址.同时定义一个指针来接受函数返回的地址. 如: in

  • C语言柔性数组实例详解

    本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值.分享给大家供大家参考.具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 不完整类型 C和C++对于不完

  • C语言中0数组\柔性数组的使用详解

    前言: 上次看到一篇面试分享,里面有个朋友说,面试官问了char[0] 相关问题,但是自己没有遇到过,就绕过了这个问题. 我自己在这篇文章下面做了一些回复. 现在我想结合我自己的理解,解释一下这个 char[0] C语言柔性数组的问题. 0数组和柔性数组的介绍 0数组顾名思义,就是数组长度定义为0,我们一般知道数组长度定义至少为1才会给它分配实际的空间,而定义了0的数组是没有任何空间,但是如果像上面的结构体一样在最后一个成员定义为零数组,虽然零数组没有分配的空间,但是它可以当作一个偏移量,因为数

  • C语言变长数组使用详解

    看如下代码: #include<stdio.h> typedef struct { int len; int array[]; }SoftArray; int main() { int len = 10; printf("The struct's size is %d\n",sizeof(SoftArray)); return 0; } 运行结果: [root@VM-0-7-centos mydoc]# ./a.out The struct's size is 4 我们可以

  • C语言编程C++柔性数组结构示例讲解

    目录 绕指柔-柔性数组 柔性数组的特点: 第一个好处是:方便内存释放 第二个好处是:这样有利于访问速度 总结 绕指柔-柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的. C99 中,结构体中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员. 柔性数组的特点: 1.结构中的柔性数组成员前面必须至少一个其他成员. 2.sizeof 返回的这种结构大小不包括柔性数组的内存. 3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,

  • C语言编程C++动态内存分配示例讲解

    目录 动态内存管理 为什么存在动态内存分配 动态内存函数的介绍 malloc申请空间和free释放空间 有借有还 free释放内存 calloc申请内存 realloc调整动态内存的大小 realloc使用的注意事项 当然realloc也可以直接开辟空间 常见的动态内存错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用free释放一块动态内存开辟的一部分 5.对同一块动态内存多次释放 6.动态开辟内存忘记释放(内存泄漏) 几个面试题

  • C语言编程入门必背的示例代码整理大全

    目录 一.C语言必背代码前言 二.一部分C语言必背代码 一.C语言必背代码前言 对于c语言来说,要记得东西其实不多,基本就是几个常用语句加一些关键字而已.你所看到的那些几千甚至上万行的代码,都是用这些语句和关键词来重复编写的.只是他们逻辑功能不一样,那如何快速的上手C语言代码,建议多看多写,下面是小编整理的C语言必背代码. 二.一部分C语言必背代码 1.输出9*9成法口诀,共9行9列,i控制行,j控制列. #include "stdio.h" main() {int i,j,resul

  • C语言学习之柔性数组详解

    目录 一.前言 二.柔性数组的用法 三.柔性数组的内存分布 四.柔性数组的优势 五.总结 一.前言 仔细观察下面的代码,有没有看出哪里不对劲? struct S { int i; double d; char c; int arr[]; }; 还有另外一种写法: struct S { int i; double d; char c; int arr[0]; }; 你应该一眼就看到了,结构体的最后一个成员数组的写法是int arr[];或者是int arr[0],这两种写法是等价的,意思是这个数组

  • 深入了解一下C语言中的柔性数组

    目录 什么是柔性数组 柔性数组的使用 什么是柔性数组 柔性数组是在C99中定义的 结构体的最后一个元素允许是未知大小的数组,这就叫柔性数组 柔性数组的长度可以写成0,也可以不规定数组长度 下面两种写法都是正确的 struct S { int i; int a[0];//柔性数组成员 } struct S { int i; int a[];//柔性数组成员 } 结构体中的柔性数组成员前面至少有一个其他成员 sizeof返回的这种结构体的大小不包括柔性数组的大小 包含柔性数组成员的结构体用mallo

  • C语言编程之初识数组线性查找和二分查找

    目录 线性查找 二分查找 先来了解一下什么是查找, 额,好吧,这没什么可了解的, 就是查找数组中的某个元素的位置或是否存在. 就这,没了.直接了解查找算法吧. 线性查找 线性查找与二分查找有些差别. 数组内元素可以是混乱无序的,即没有按顺序储存.这方法很简单,就是从首元素开始,依此向后查找,比较.仅此而已.运用循环,依次对比. 看代码吧. #include <stdio.h> int main(void) { int arr[] = { 5,4,6,8,7,9,10,2,3,1 }; int

  • Sublime Text 3 实现C语言代码的编译和运行(示例讲解)

    Sublime Text 3是一款优秀的代码编辑软件.界面简洁,轻巧快速,很受大家的欢迎. 最近开始用他来编辑数据结构的代码,这就需要在新建编译系统. 具体方法如下: 首先: 接下来是关键的一步,将以下代码粘贴到弹出的编辑页面中,文件名为name.sublime-build形式,name是新建的编译器名字. { "cmd": ["gcc","${file}","-fexec-charset=gbk","-o"

  • C语言中的柔性数组你真的了解吗

    目录 柔性数组概念: 特点: 与指针动态开辟的比较 指针动态开辟 柔性数组 指针动态开辟的缺点 总结 柔性数组概念: 柔性数组就是一种特殊的数组 它也是结构体最后一个成员 也就是说,它存在结构体最后一个成员的位置上 特点: 1.柔性数组在结构体的大小是未知的,在sizeof中不计算其大小 #include<stdio.h> struct S { int n ; int arr[0];//或者int arr[]; }; main() { printf("The size of the

  • C语言编程PAT乙级学习笔记示例分享

    目录 1001 害死人不偿命的(3n+1)猜想 1002 写出这个数 1003 我要通过! 1004 成绩排名 1005 继续(3n+1)猜想 1006 换个格式输出整数 1007 素数对猜想问题 1008 数组元素循环右移问题 1009 说反话 1010 一元多项式求导 1011 A+B 和 C 1012 数字分类 1013 数素数 1014 福尔摩斯的约会 1001 害死人不偿命的(3n+1)猜想 #include<iostream> #include<stack> using

  • 解析Go语言编程中的struct结构

    struct和C语言的很相似,模拟出class的功能,但是不完全的!没有构造函数等! struct的申明 复制代码 代码如下: package main import "fmt" type Person struct {  Age  int  Name string } func main() {  //初始化两种  a := Person{}  a.Age = 2  a.Name = "widuu"  fmt.Println(a)  b := Person{   

随机推荐