C语言数组:零长数组,可变数组,多维数组

09-数组的含义以及零长数组变长数组与多维数组 阅读详情


零长数组

零长数组,就是长度为0的数组。也叫柔性数组.
数组的长度在编译时是未确定的,在程序运行的时候才确定,甚至可以由用户指定大小。比如,我们可以定义一个数组,然后在程序运行时才指定这个数组的大小,还可以通过输入数据来初始化数组

用途:主要用途是满足需要变长度的结构体
用法:在一个结构体的最后,声明一个长度为0的数组,就可以使得这个结构体是可变长的,对于编译器来说,此时长度为0的数字并不占空间,因为数组名本身不占空间,它是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量

错误用法

int main(int argc, char const *argv[])
{   
    char my[0];
    strcpy(my,"asjkduhij");
    puts(my);
    return 0;   //单独使用,会报错,因为数组根本就没有空间,也就不能复制到数组里面了
}

正确用法(结合结构体):

struct student
 {
    int id;//4字节
    int ranking;//4字节
    char name[0];//0字节   //编译器 编译时有个char数组name,malloc 运行时动态分配内存
 };
 int main(int argc, char const *argv[])
{
    
	printf(" struct teacher 占用字节数:%llu\n",sizeof(struct teacher));
    //需要动态分配内存
    struct teacher* tp=(struct teacher*)malloc(sizeof(struct teacher)+sizeof(char)*10);
    tp->id=2021;
    tp->ranking=1;
    strcpy(tp->name,"KKlovecode");
    printf("struct teacher 中name占用字节数:%llu\n",strlen(tp->name));
    free(tp);//释放,必须程序员自己手动释放内存
    return 0;
} 

可变数组

变长数组:使用一个变量作为数组的长度(元素个数);
变长数组并不是说在任意时候它的长度可以随意变化,实际上只是在定义之前数组的长度是未知的一个变量来决定,但是定义语句过后变长数组的长度都由定义那一刻变量的大小来决定。
例如:

//变长数组:
int main(int argc, char const *argv[])
{
    printf("please input the length of array:\n");
    int len = 0;
    scanf("%d",&len);
    int my[len];
    for (size_t i = 0; i < len; i++)
    {
        my[i]=i;
    }
      for (size_t i = 0; i < len; i++)
    {
        printf("%d",my[i]);
    }
    printf("\n");
    printf("please input the length of array:\n");
    scanf("%d",&len); //此时再尝试改变len的值
    printf("the length of array:%d\n",sizeof(my)/sizeof(my[0]));//看看原先数组的长度大小
    printf("length=%d\n",len);//这是更改之后len的值,值是改后的
    return 0;
}

结果:
在这里插入图片描述
第一次输入10之后,数组的长度就变成了10
之后再想改变数组的长度,此时数组的长度并不会改变,虽然变量len的值确实会改变

多维数组

二维数组:由多个一维数组组成,每个一维数组在内存中连续存储。
定义:

int array[rows][columns]; // rows 是行数,columns 是每行的列数

初始化与赋值:

int main(int argc, char const *argv[])
{
    int a[3][4]={{1,2,3,4},{21,22,23,24},{31,32,33,34}};
    //int a[3][4]={1,2,3,4,21,22,23,24,31,32,33,34}; //不要把它当做维,其实它初始化的时候和上面一样
    a[2][1] =33;
    for (size_t i = 0; i < 3; i++)
    {
        for (size_t j = 0; j < 4; j++)
        {
            printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

在这里插入图片描述
还有一种赋值时不完全赋值:

int main(int argc, char const *argv[])
{
      //二维数组本质就是由一维数组构成
    int he[3][2]={8,6,5,4};
    for (size_t i = 0; i < 3; i++)
    {   
        //内层控制列
        for (size_t j = 0; j < 2; j++)
        {
            printf("%d ",he[i][j]);
        }
        printf("\n");
    }
    return 0;
}

结果:
在这里插入图片描述

亦或者:

int main(int argc, char const *argv[])
{
      //二维数组本质就是由一维数组构成
    int our[3][2]={{8},{6,5},{4}};
    for (size_t i = 0; i < 3; i++)
    {   
        //内层控制列
        for (size_t j = 0; j < 2; j++)
        {
            printf("%d ",our[i][j]);
        }
        printf("\n");
    }
    return 0;
}

结果:
在这里插入图片描述

C语言结构体中的零长数组 C语言结构体中的零长数组 实例 struct A { int len; int var[0]; }; struct B { int len; int *var; } 其中,结构体A使用了零长数组,结构体B用了指针 为什么要用零长数组 我归纳了以下三点原因: 节约空间 在int和指针占4字节的机器上 sizeof(A) // 4 sizeof(B) // 8 这是因为A中的var是数组名,B中的var是指针变量 编译器对数组名和指针变量的处理方式不一样。 我们可以把这 阅读详情

相关推荐

手把手教你用Wireshark国密版分析TLCP和IPSec协议(附下载地址)

本文详细介绍了Wireshark国密版在TLCP和IPSec协议分析中的实战应用,包括环境配置、协议解析、合规性检查及高级分析技巧。该工具针对商用密码算法(如SM2/SM3/SM4)进行了专项优化,支持GB/T 38636-2020 TLCP和GB/T 36968-2018 IPSec VPN等国家标准,帮助开发者与安全工程师高效完成密评分析任务。

weixin_29325955的博客 549

嵌入式C语言自我修养 (05):零长度数组

5.1 什么是零长度数组 顾名思义,零长度数组就是长度为0的数组。 ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的。在ANSI C 中定义一个数组的方法如下: int  a[10]; C99 新标准规定:可以定义一个变长数组。 int len; int a[len]; 也就是说,数组的长度在编译时是未确定的,在程序运行的时候才确定...

宅学部落-王利涛 1770

告别Keil/IAR:在VSCode中用CMake+Clangd打造丝滑的STM32开发环境(附完整配置)

本文详细介绍了如何在VSCode中使用CMake和Clangd搭建高效的STM32开发环境,替代传统的Keil/IAR工具。通过完整的配置指南和快速开发技巧,帮助开发者实现轻量级、高度可定制的现代化开发流程,显著提升STM32项目的开发效率。

weixin_26843605的博客 164

什么是零长数组/柔性数组?为什么使用零长数组?

零长数组一般和结构体搭配使用,其比起在结构体中声明一个指针变量、再进行动态分配的效率要高。因为在访问数组内容时,不需要间接访问,避免了两次访存。同时因为零长数组表示数据内容时,其数据空间是动态分配的,所以比静态分配内存要灵活。

cam_______的博客 529

基于simulink的变压器保护仿真设计【MATLAB源码+Word文档】

电力系统变压器保护MATLAB/simulink仿真设计。纵联差动保护-过电流保护-距离保护

weixin_761237174的博客 1270

Jetson Orin边缘语音AI实战:用Riva ASR/TTS + Llama 2打造离线智能语音助手

本文详细介绍了如何利用NVIDIA Jetson Orin的边缘计算能力,结合Riva ASR/TTS语音引擎和Llama 2大语言模型,构建完全离线的智能语音助手。通过硬件优化、量化部署和性能调优,实现在网络不稳定环境下的高效语音交互,适用于智能家居、车载系统等场景。

weixin_29053383的博客 242

长度为0的数组

本文为转载,原地址为https://blog.youkuaiyun.com/gatieme/article/details/64131322 1 零长度数组概念 众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展. 多数情况下, 其应用在变长数组中, 其定义如下 struct Packet {...

Luobooooo的博客 4457

AD学习笔记(一)基础认识

文章目录AD学习笔记第一讲 AD基础认识一、两库两图(分别对应下图)1、PCB图(pcbdoc)2、原理图(schdoc)3、原理图库(schlib)4、PCB库(pcblib)二、封装1、DIP封装2、LQFP封装三、绘制整体流程1、建立工程(PrjPcb)2、建立两库两图并保存整个工程(五次)3、从库中提取绘制原理图4、原理图导入pcb图5、根据原理图布线6、pcb图交由工厂打板 AD学习笔记 第一讲 AD基础认识 一、两库两图(分别对应下图) PCB图(pcbdoc) 原理图(schdoc) PCB库

qq_52465473的博客 6686

C语言的零长数组

C语言的零长数组 在标准 C 或者 C++ 中由于不支持 0 长度的数组,所以 int array[0]; 这样的定义是非法的。不过有些编译器的扩展功能支持 0 长度的数组。 在 C 中,0 长度的数组的主要用途是用来作为结构体的最后一个成员,然后用它来访问此...

aezympxj84131的博客 256

Autosar进阶专栏索引

Autosar进阶专栏索引

赞的博客 3538

基于Playwright与异步技术的公司评价智能爬取实战:以Glassdoor为例

本文将介绍一套基于最新Python技术的智能爬虫解决方案,使用Playwright实现浏览器自动化,结合异步编程和智能解析技术,高效抓取Glassdoor等平台的公司评价数据。我们不仅关注数据获取,更注重数据的结构化处理和反反爬虫策略的实现。

2201_76125261的博客 223

C语言进阶之路-数组与指针

本文细讲了打怪路上的数组和指针的特点和消灭方法,各位只需认真学习,即可消灭它们。祝各位都可爬上C语巅峰,斩尽拦路小妖。

志不在此,打卡留念 2374

【AI Agent教程】各种Agent开发框架都是如何实现ReAct思想的?深入源码学习一下

驱动大模型有很多种方式,例如纯Prompt方式、思维链方式、ReAct方式等。ReAct 方式是 AI Agent 最常用的实现思路之一,它强调在执行任务时结合推理(Reasoning)和行动(Acting)两个方面,使得Agent能够在复杂和动态的环境中更有效地工作。

同学小张的博客 6396

GCC 中零长数组与变长数组

前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在我所学的C语言知识中,这种数组的定义在编译时就应该有问题的,因为定义数组时,数组的长度必须要是一个大于0的整型字面值或定义为 const 的常量

海风林影 2175

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于C语言零长数组

忙里偷闲验证了一下很多年前刚入门C的时候的一个想法: typedef struct msg{ int len; char str[0]; } msg_str; typedef struct head{ int type; int cmd; msg_str msg; } zynq_head; int head_temp; zynq_head head; head_temp = (int)&h...

weixin_42278284的博客 337

结构体零长数组的妙用

// 零长数组:用于结构体的末尾,本身不占用空间,因此对sizeof没有影响,但有利于实现可变程度的数组 // 如果有点编译器不支持,为了通用型,可以换成1长数组 #include #include // 结构体定义 struct Item1 { int type; int len; unsigned char data[0]; // 或: // un

纯,属虚构 4347

Linux C柔性数组(零长数组)

本文简单介绍了C语言当中柔性数组的用法。

DIANZI520SUA的专栏 928

零长数组(柔性数组)

零长数组一般在结构体中使用,并且放在结构体的末尾。在没有给零长数组分配空间之前是不能使用它的。 它可以根据你的数据大小变化而变化。 #include #include #include struct data { int msglength; char msg[0]; }; int main(int argc, char *argv) { char buf

linuxqb的博客 512

c语言、c++扩展介绍 ————柔性数组、零长数组。

注意: 一下所有的讨论都是基于结构体内部而言的,并不是单独拿出来的情境下的结论。

ALex_zry的博客 538

linux 零长数组,GNU C中的零长数组

C语言没有STL,缺乏对动态长度字符串功能的支持;同时,C使用'\0'判断字符串的结尾,不具有二进制安全性。然而在程序开发时,我们可以通过自定义的方式,实现简易的动态长度字符串功能。动态长度字符串结构定义如下:struct DynamicBuffer{unsigned len; // 实际长度unsigned free; // 剩余可用空间大小char data[0]; // 实际内容};其...

weixin_39609071的博客 201

c语言中数组int*,C语言数组

数组的基本概念数组就是一个可以一次性定义多个相同类型的变量,并可以放到一个连续的内存中去。初始化只有在定义的时候顺便赋值才叫初始化。int a = 1024 ; int arr[5] = {1,2,3,4,5}; // 完全初始化int arr1[] = {1,2,3,4,5,6,7,8,9,10} // 正确,定义的时候并没有确定大小, 初始化后才确定的大小arr2 = {1,2,3,4,5,}...

weixin_39719427的博客 4124

C语言(柔性数组,零长数组)

可以定义长度为0的数组,这样的数组被称为零长数组或者柔性数组,通常被用在结构体中存放长度可变的数据。   拓展: struct node {     int a;     float f;     char data[0]; }; 在给结构体分配内存的时候,我们会根据需要多分配多一点内存。 struct node *p = malloc(

林世霖的技术博客 1449

关于零长数组

typedef struct {          int head;            int size;           char reply;         char data[0]; } packet; 这里的char data[0] 即为零长数组;其不占用任何空间,甚至是一个指针的空间都不占;其主要是作为扩展数组用的,我们可以这样使用它, packet*  cmd

lgp88的专栏 903

struct char[0] 零长数组使用

在c中虽然支持了变长数组,但是在使用的时候还是会有诸多限制。分配在栈上,也就是不能返回变长数组的指针,同时还增加了栈溢出的风险,以下是几种不能使用的场景。 不能使用extern声明的长度 在struct members中定义长度 在static变量中定义长度 在函数定义中定义长度 extern int n; int A[n]; // invalid: file scope VLA extern int (*p2)[n];

Sweet_Oranges的专栏 433

linux 零长数组,GCC 中零长数组与变长数组

前两天看程序,发现在某个函数中有下面这段程序:int n; //define a variable nint array[n]; //define an array with length n在我所学的C语言知识中,这种数组的定义在编译时就应该有问题的,因为定义数组时,数组的长度必须要是一个大于0的整型字面值或定义为 const 的常量。例如下面这样int a...

weixin_39761696的博客 261

Linux c:零长数组

1、零长数组 GNU C允许声明长度为零的数组,但它只能被用于结构体的最后一个成员。 实例: #include <stdio.h> #include <stdlib.h> typedef struct pos { double lon; double lat; }tPos; struct line {...

weixin_30547797的博客 347
上一篇: 初始C语言-数组&字符数组与字符串
下一篇: const修饰的常量指针与指针常量
kklovecode
博客等级 码龄4年 127粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kklovecode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值