-
2022-04-02 21:49:31
1. 常见计算数组大小的方式
1.1 sizeof()
这是用的最多的一种方式。它是一个运算符,在编译时就计算出变量的内存大小。需要熟练它的使用规则。
uint8_t val8; // 长度1 uint32_t val32; // 长度4 uint8_t* ptr8; // 长度4 uint32_t* ptr32; // 长度4 uint8_t arr8[] = {1,2,3,4,5,6}; // 长度6 uint32_t arr32[] = {11,12,13,14,15,16}; // 长度24 struct val_type{ uint8_t val1; uint16_t val2; uint32_t val3; }; struct val_type val_struct; // 长度8 union union_type{ uint8_t val8_1; uint16_t val16; uint8_t val8_2; uint32_t val32; }; union union_type union_val; // 长度4 printf("val8=%d, val32=%d, ptr8=%d, ptr32=%d, arr8=%d, arr32=%d\r\n",\ sizeof(val8), sizeof(val32), sizeof(ptr8), sizeof(ptr32), sizeof(arr8), sizeof(arr32)); printf("val_struct=%d, union_val=%d\r\n", sizeof(val_struct), sizeof(union_val));
输出结果如下:
val8=1, val32=4, ptr8=4, ptr32=4, arr8=6, arr32=24 val_struct=8, union_val=4
这里说明下几个比较特殊的情况:
- 数组:这里输入数组名,虽然数组名也可以直接获取地址,但编译器是知道指针和数组的区别。所以这里输入数组名就能得出数组大小。
- 结构体:结构体这里也是输入结构体名,但要获取结构体地址是要使用取址符‘&’的。当然编译器也是知道这是个结构体变量,所以获取到的值是8。为什么是8?因为我的编译环境是32位的,所以默认是以32位对齐的。而我这里的结构体只声明了7个字节,所以编译器自作主张地给我配齐了8字节,方便它4字节对齐。有编译器指令可以声明1字节,2字节对齐。这个知识值得深究。
- 联合体:这里得出的大小是4。因为联合体与结构体最大的区别就是,联合体的大小是有最大的那个成员决定。当然关于联合体的情况还是比较多内容的。也是值得深究。
至此,介绍了常见的一些变量的大小计算方式。实际情况中可能还有更复杂的情况。一个人记不住所有知识,所以最简单的方法就是写代码调试。
1.2 strlen()
记住它的特性:
- 程序运行时遍历一段内存大小;
- 以'\0'(即0)结尾;
所以最好用于字符串大小的运算。
1.3 for(;;)循环
for循环就要自己定义逻辑了。
灵活性较强。
如果要计算数组大小,最好是在程序初始化时。
程序运行时在计算,会影响cpu实时性。
2. 分享个特殊情况
extern uint8_t arr[] ; // 这个数组长度上万个字节
它的缺点是:
- 不能在外部声明的c文件中适用sizeof计算其大小,编译器不通过;
- 由于是数值数组,不适用strlen,当然效率也不高;
- 适用for循环的效率也不高;当然如果在初始化时使用,也还可以接受,但要声明一个全局变量。
今天突然想到个好方法:
uint8_t arr[]={1,2,3,4,5,6,7,8,9,10......}; uin32_t get_arr_len(void) { return sizeof(arr); } /****************其它c文件声明这个************************/ extern uin32_t get_arr_len(void);
问题得以解决。
3.总结
写这个文章是遇到第2节的那个问题。查了很久没找到答案。所以这里总结一下这些知识点。
更多相关内容 -
MongoDB下根据数组大小进行查询的方法
2020-09-10 15:59:13主要介绍了MongoDB下根据数组大小进行查询的方法,分别实现了指定大小的数组和某个范围的数组,需要的朋友可以参考下 -
C语言数组大小
2022-02-09 22:59:58通过sizeof()函数得到C语言数组长度在数组进行集成初始化时(上一篇中有相关内容,链接在下方),数组长度会由编译器设定。数组的初始化
https://blog.csdn.net/weixin_52133421/article/details/122850510?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
如果需要得到数组的大小,可以通过sizeof函数。sizeof(array)可以得到array数组所占的内容大小,单位为字节(Byte),sizeof(array[i])可以得出单个元素所占内容大小。所以可以通过sizeof(array)/sizeof(array[i])得出数组的长度。
源代码:
#include<stdio.h> int main() { int i; int number; int array[] = {1,3,5,4,7,0,4,6,9,12,16,23}; printf("数组总字节数:%lu\n", sizeof(array)); printf("数组单个元素字节数:%lu\n", sizeof(array[0])); number = sizeof(array) / sizeof(array[0]); //number即为数组长度 printf("数组长度:%d\n", number); for (i = 0; i < number; i++) printf("%d ", array[i]); return 0; }
测试结果:
数组总字节数:48
数组单个元素字节数:4
数组长度:12
1 3 5 4 7 0 4 6 9 12 16 23这样得出数组长度的最大好处在于一旦修改数组中初始的数据,不需要再修改遍历的代码,例如其中的遍历数组操作。
for (i = 0; i < number; i++) printf("%d ", array[i]);
无论数组中的数据怎么修改,数组长度始终是正确的。
-
sizeof判断数组大小
2021-07-07 17:42:14} 使用sizeof运算符是可以获取数组的大小的,但是记得当sizeof作用于指针时,大小是4。 第一个数组之所以size是4,只是因为collectionA中存放的其实不是adef5444,而是一个const char *指针,指向adef5444而已。...int main() { const char *collectionA[] = { "adef5444" }; // 4 const char *collectionB[] = { "adef5444", "CDE" }; // 8 const char *str = "abc"; // 4 cout << sizeof(collectionA) << endl; cout << sizeof(collectionB) << endl; cout << sizeof(str) << endl; return 0; }
使用sizeof运算符是可以获取数组的大小的,但是记得当sizeof作用于指针时,大小是4。
第一个数组之所以size是4,只是因为collectionA中存放的其实不是adef5444
,而是一个const char *指针,指向adef5444
而已。collectionB中存放了两根指针,所以大小是8。 -
如何调整数组大小
2021-03-29 22:32:56如何调整数组大小 选择用数组表示栈内容意味着用例必须预先估计栈的最大容量。在Java中,数组一旦创建,其大小是无法改变的,因此栈使用的空间只能是这个最大容量的一部分。选择大容量的用例在栈为空或几乎为空...如何调整数组大小
选择用数组表示栈内容意味着用例必须预先估计栈的最大容量。在Java中,数组一旦创建,其大小是无法改变的,因此栈使用的空间只能是这个最大容量的一部分。选择大容量的用例在栈为空或几乎为空时会浪费大量的内存。例如,个交易系统可能会涉及数十亿笔交易 和数千个交易的集合。即使这种系统般都会限制每笔文易只能出现在一个集合中, 但用例必须保证所有集合都有能力保存所有的交易。另一方面,如果集合变得比数组更大那么用例有可能溢出。为此,push() 方法需要在代码中检测栈是否已满,我们的API中也应该含有一个isFull() 方法来允许用例检测栈是否已满。我们在此省略了它的实现代码,因为我们希望用例从处理栈已满的问题中解脱出来,如我们的原始Stack API所示。因此,我们修改了数组的实现,动态调整数组a[] 的大小,使得它既足以保存所有元素,又不至于浪费过多的空间。实际上,完成这些目标非常简单。首先,实现一个方法将栈移动到另一个大小不同的数组中:
private void resize(int max) { //将大小为N < = max 的栈移动到一个新的大小为 max的数组中 Item[] temp = (Item[]) new Object[max]; for (int i = 0; i < ) temp[i] = a[i]; a = temp; }
现在,在push() 中,检查数组是否太小。具体来说,我们会通过检查栈大小N和数组大小a. length是否相等来检查数组是否能够容纳新的元素。如果没有多余的空间,我们会将数组的长度加倍。然后就可以和从前一样用a[N++] = item 插入新元素了:
pulic void push(Item item) { //将元素压入栈顶 if (N == a.length) resize(2*a.length); a[N++] = item; }
类似,在pop() 中,首先删除栈顶的元索,然后如果数组太大我们就将它的长度减半。只要稍加思考,你就明白正确的检测条件是栈大小是否小于数组的四分之一。在数组长度被减半之后,它的状态约为半满,在下次需要改变数组大小之前仍然能够进行多次push() 和pop() 操作。
public Item pop() { //从栈顶删除元素 Item item = a[--N]; a[N] = null; //避免对象游离 if (N > 0 && N == a.length/4) resize(a.length/2); return item; }
在这个实现中,栈永远不会溢出,使用率也永远不会低于四分之一(除非栈为空,那种情况下数组的大小为1。
码子不易, 点个赞呗 ♡♡♡
关注『 Mr阿布 』微信公众号
有问题欢迎大家交流 ☟ ☟ ☟
-
Python二维数组大小
2022-01-01 20:38:31rows = len(array) cols = len(array[0]) -
c++数组大小到底可不可以为变量
2022-04-09 17:16:34c++数组大小到底可不可以为变量???????? -
C语言 获取数组大小,遍历数组
2019-04-10 14:50:24//子函数中无法正确获取数组大小 for(int i = 0; i ; i++) { ary[i] += n; printf("%d ", ary[i]); } printf("\n"); } int main(int argc, char *argv[]) { int ary[] = {1,2,3,88,99}; // pp(ary, sizeof... -
字符数组大小的判断
2021-02-20 09:35:32各种类型字符数组的大小 #include <stdio.h> #include <stdlib.h> int main() { //只要sizeof(数组名)以及&数组名这两种情况时,数组名表示整个数组,其他时候数组名都表示首元素的地址 char ... -
C++计算数组大小
2020-04-07 18:37:491 c语言计算数组大小 2 c++计算数组大小 1 c语言计算数组大小 c语言通过如下方式可以获取数组大小: int arr[] = {23, 34, 32}; int arr_size = sizeof(arr)/sizeof(arr[0]); 当数组作为函数参数时,通过这种... -
一维数组大小的判断
2021-02-20 09:01:09指针和数组大小的判断 #include <stdio.h> #include <stdlib.h> int main() { //只要sizeof(数组名)以及&...//sizeof(数组名)计算的是数组的总大小 4*4=16; printf("%d\n", sizeof(a+0));//数组名不 -
Matlab中基本运算的兼容数组大小
2020-12-08 10:52:45以最简单的情况为例,如果两个数组大小完全相同或其中一个为标量,则这两个数组大小是兼容的。执行按元素运算或函数时,MATLAB 会将大小兼容的数组隐式扩展为相同的大小。 大小兼容的输入 二维输入 以下是一些... -
二维数组大小的确定!你真的是二维数组吗?
2020-07-01 20:03:23首先我们真的 C++可以直接定义二维数组 只要row和col都知道,就可以确定二维数组大小。 int num[10][10]; 明确了row和col,就不太容易越界了。同时我们也可以通过sizeof来确定行和列的大小(关于如何用sizeof确定... -
C++从输入创建数组大小
2020-10-02 21:41:53//从输入创建数组大小,记得最后要删除数组 int *p = (int *)malloc(n*sizeof(int));/*或者这样创建从输入确定数组大小*/ int *pp = (int *)calloc(n*sizeof(int),0); //............ free... -
C/C++通过指针得到数组大小
2020-10-02 20:14:31C/C++通过指针得到数组大小 引入<malloc.h>头文件,使用其中的_msize()函数得到数组的字节数,再除以sizeof(type)即可。 int* a; a = (int*)malloc(sizeof(int) * 6); cout<< _msize(a)/sizeof(a[0]); -
数组大小的计算
2019-03-28 22:51:51当我们创建一个数据,想要计算数组的大小: int arr[5] = {1,2,3,4,5}; int arrsize = sizeof(arr)/sizeof (arr[0]); int arrsize2 = sizeof(arr)/sizeof (int); qDebug() << "before: arrsize = " <&... -
c#固定数组大小_在C#中声明一个固定大小的数组
2020-07-17 18:26:26c#固定数组大小In C#, an array can be declared with a fixed size length and a variable length. Sometimes it's required that we need to have an array of fixed length. In this tutorial, we will learn how... -
matlab中使用read_bfee.c读取csi数据时提示请求数组超过预设数组大小。
2020-05-22 01:39:50预设的最大数组大小。创建大于此限制的数组可能需要较长时间,并且会导致 MATLAB 无响应。有 关详细信息,请参阅数组大小限制或预设项面板。 出错 read_bf_file (line 61) ret{count} = read_bfee(bytes); ... -
sizeof 和 strlen 计算数组大小和长度详解
2020-02-02 11:31:45sizeof 首先sizeof并非为一个函数,而是C语言中的一个关键字。...sizeof 求大小看的仅仅是它的类型大小,而非其他。所以我们在计算时只要认清楚它的类型大小就行。 arr 和 &arr 的区别. int arr[10] = ... -
c语言动态设定数组大小 —— 柔性数组
2019-04-04 09:21:33柔性数组:大小待定的数组 c语言中结构体最后一个元素可以是未知大小的数组 如: struct SoftArray { int len; int array[]; //柔性数组,不占用存储空间 }; 柔性数组的使用方法:(创建一个大小指定的数组并... -
C中允许的最大静态数组大小是多少?
2021-05-19 15:25:37你的大部分问题都得到了回答,但只是给出一个让我的生活更轻松的答案:定性地,非动态分配的数组的最大大小取决于您拥有的RAM量.它还取决于阵列的类型,例如一个int可能是4个字节,而double可能是8个字节(它们也是系统... -
3.Matlab——数组大小
2019-07-16 16:04:123.1 size函数: 3.2 length函数:返回数组中尺寸较大维度的长度 3.3 numel:返回元素总个数,m行n列,则总个数=m*n -
【MATLAB】利用size()函数输出数组大小
2020-11-28 16:41:06背景 在写Matlab时经常需要计算数组大小,来控制循环等等,在这其中常用的函数就是size()函数,本文主要介绍其基本用法。 基本操作 1、输出数组大小 格式:sz = size(A) 返回一个行向量,其元素是 A 的相应维度的... -
matlab开发-调整数组和图像的大小
2019-08-24 04:17:29matlab开发-调整数组和图像的大小。y=调整大小(x,newSize)使用离散余弦变换调整输入数组x的大小。 -
C#动态分配数组大小根据实际添加的参数改变大小
2018-12-21 22:33:11现在有个需求:我有一一大串不大小固定的数据需要添加到数组中,如果给数组固定死大小的话,不太好,后来找到了方法参考这个博客 string[] roleRangeAllowUsername = new string[0]; //先定义大小为0的数组,后面经过... -
Fortran中分配数组大小
2019-03-04 19:43:33用Fortran写程序经常会分配一些数组使用,但究竟能分配多大的数组,这受编译环境、电脑可用内存容量、数组分配方式的影响,做了些测试,分享一下。 操作系统:Win8.1 64位 内存:8G(由于集成显卡需要使用一部分... -
【C++】定义数组大小用常量
2021-02-04 17:23:00新建一个需要从键盘输入大小的数组时,程序报错 int n; cin>>n; int a[n]; 采用动态内存分配的方法,修改为: int n; cin>>n; int *a = new int[n]; . . . delete[] a; 参考:... -
Numpy之调整数组大小
2018-12-27 09:09:36Numpy可以简单的操作数组与创建矩阵。 ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。...shape属性调整数组大小 import numpy as np a = np.array([[1,2,3],... -
Numpy 返回数组大小
2019-05-29 10:31:00import numpy as np a = [[1, 2], [3, 4], [5, 6]] b = np.array(a) len(a) # 3 len(b) # 3 np.size(a) # 3 np.size(a, 0) # 3 np.size(a, 1) # err b.size # 6 np.size(b) # 6 ...np.size(b, 0) ...