首页 > 其他分享 >柔性数组

柔性数组

时间:2024-01-07 21:32:40浏览次数:32  
标签:ps arr int ++ 数组 柔性 sizeof NULL

接下来两个不同形式动态开辟数组空间

1.柔性数组的使用  优--效率高,内存利用率高
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
	int a;
	char arr[];//未知大小的柔性数组成员 数组的大小是可以调整的
}s;
int main()
{
	//printf("%d\n",sizeof(s));//最后一个数组不占空间
	s*ps= (s*)malloc(sizeof(s) + 5 * sizeof(int));//开辟24个字节空间
	if (ps == NULL)
	{
		return 0;//开辟失败则退出
	}
	else
	{
		ps->a = 100;
		int i = 0;
		int a = 100;
		for (i = 0; i < 5; i++)
		{
			ps->arr[i] = i;
		}
		for (i = 0; i < 5; i++)
		{
			printf("%d ",ps->arr[i]);
		}
		//重新开辟44个字节
		s*ptr=(s*)realloc(ps, 44);
		if (ptr != NULL)
		{
			ps = ptr;
		}
		for (i = 5; i < 10; i++)
		{
			ps->arr[i] = i;
		}
		for (i = 5; i < 10; i++)
		{
			printf("%d ",ps->arr[i]);
		}
		free(ps);
		ps = NULL;
	}
	
	return 0;
}
2.直接操作数组开辟空间--差(malloc越多内存碎片越多,又比较繁琐)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
	int n;
	int* arr;
}s;
int main()
{
	s *ps=(s*)malloc(sizeof(s));
	ps->arr = malloc(5 * sizeof(int));
	if (ps == NULL)
	{
		return 0;
	}
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 5; i++)
	{
		printf("%d ",ps->arr[i]);
	}
	//调整大小
	int*ptr=realloc(ps->arr, 10 * sizeof(int));
	if (ptr != NULL)
	{
		ps->arr = ptr;
	}
	for (i = 5; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 5; i < 10; i++)
	{
		printf("%d ",ps->arr[i]);
	}
	//释放内存
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

标签:ps,arr,int,++,数组,柔性,sizeof,NULL
From: https://blog.51cto.com/u_16425777/9135004

相关文章

  • C 语言指针完全指南:创建、解除引用、指针与数组关系解析
    C语言中的指针创建指针我们可以使用引用运算符&获取变量的内存地址:intmyAge=43;//一个int变量printf("%d",myAge);//输出myAge的值(43)printf("%p",&myAge);//输出myAge的内存地址(0x7ffe5367e044)指针是一个将另一个变量的内存地址作为其值的变量。......
  • C 语言指针完全指南:创建、解除引用、指针与数组关系解析
    C语言中的指针创建指针我们可以使用引用运算符&获取变量的内存地址:intmyAge=43;//一个int变量printf("%d",myAge);//输出myAge的值(43)printf("%p",&myAge);//输出myAge的内存地址(0x7ffe5367e044)指针是一个将另一个变量的内存地址作为其值的变量......
  • 树状数组
    给出一个长度为nn的数组,完成以下两种操作:1.将第ii个数加上kk2.输出区间[i,j][i,j]内每个数的和朴素算法单点修改:O(1)O(1)区间查询:O(n)O(n)使用树状数组单点修改:O(logn)O(logn)区间查询:O(logn)O(logn)前置知识lowbit()lowbit()运算:非负整数xx在二进制表示下最低位1及其后面的0构......
  • JavaScript——数组的归并方法
    JavaScript的reduce和reduceRight的作用是通过遍历数组得到一个结果,原理如下:functionmyReduce(execute,initValue){constlength=this.lengthletresultfor(leti=0;i<length;i++){if(i===0){consthasInitValue=initV......
  • 数组
    数组的概述数组的特点:数组是有序排列的。1、数组属于引用数据类型的变量。数组的元素既可以是基本数据类型也可以是引用数据类型。2、创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。3、数组的长度一旦确定,就不能修改。数组的分类按......
  • MySQL 8.0的SQL查询JSON返回的数据类型为字符串而非数组
    在MySQL8.0中,SQL查询JSON返回的数据类型确实是字符串,而不是数组。这是因为MySQL将JSON数据存储为字符串,并提供了一些函数和操作符来处理JSON数据。但是,你可以使用内置的JSON函数来处理返回的JSON字符串。例如,你可以使用JSON_EXTRACT函数来提取JSON字符串......
  • 指针数组与数组指针的区别及相关知识
    区别:指针数组:定义int*p[n]可称为指针的数组,是数组,数组里的元素都是指针。也就是说数组存储的是指针,数组占多少字节由数组本身决定。指针数组+1不同类型的变化如下//eg:用指针parr指向一个一维数组intmain(){ int*parr[5]={0,1,2,3,4}; printf("%x\n",parr);//数组名代......
  • 2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示
    2024-01-03:用go语言,给你两个长度为n下标从0开始的整数数组cost和time,分别表示给n堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠,一位需要付费的油漆匠,刷第i堵墙需要花费time[i]单位的时间,开销为cost[i]单位的钱。一位免费的油漆匠,刷任意一堵墙的时间为1......
  • 稀疏数组
    问题介绍需求:编写五子棋游戏中,有存盘退出和续上盘的功能。 分析问题:因为二维数组的很多值是默认值0,因此记录了很多没有意义的数据。解决:稀疏数组概念当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方式是:记录数组一共有......
  • 【C++】STL 容器 - stack 堆栈容器 ① ( stack 堆栈容器特点 | stack 堆栈容器与 dequ
    文章目录一、stack堆栈容器简介1、stack堆栈容器引入2、stack堆栈容器特点3、stack堆栈容器与deque双端数组容器对比二、代码示例-stack堆栈容器简单示例1、代码示例2、执行结果一、stack堆栈容器简介1、stack堆栈容器引入C++语言中的STL标准模板库中的stac......