在C语言中,使用malloc函数创建动态数组,使用一个指针指向它,使用下标进行访问。

unsigned long *a = (unsigned long *)malloc(2 * sizeof(int));
a[0] = 1000;
a[1] = 2000;
printf("%d  %d\n", a[0], a[1]);
free(a);

上述例子,申请了两个int空间的动态数组,使用int *指向它,使用a[0],a[1]访问,这与数组访问一样,区别就是动态申请内存在堆空间,还需要使用free进行释放,而一般的数组在栈空间,自动释放。

这个很容易,这里想延申类比一下,这是Liunx 0.11内核类似的一段代码很有趣。

#include <stdio.h>
#include <stdlib.h>typedef struct desc_struct
{                               unsigned long a, b;
}
desc_table[256];desc_table idt, gdt;void set_gate(unsigned long *gate_addr) {gate_addr[0] = 100;gate_addr[1] = 200;
}int main() {int size = sizeof(idt) / sizeof(idt[0]); // size = 256printf("%d\n",size);printf("%d  %d\n", idt[0].a, idt[0].b);set_gate((unsigned long *)&idt[0]);printf("%d  %d\n", idt[0].a, idt[0].b); // 输出 100  200return 0;
}

这个例子比较奇怪,奇怪在结构体的访问上

  1. main函数调用了set_gate函数,并且将idt[0]的地址作为参数传了过去
  2. set_gate函数获取了idt[0]的地址之后,直接使用下标去访问结构体内的两个变量

我们知到,一般结构体变量是使用.,结构体指针使用->访问,这种使用下标的挺诡异的,我们分析一下。

  1. 结构体内的两个变量是连续的,都是unsigned long类型
  2. 现在有一个unsigned long*指针指向了结构体内第一个变量(默认指向开头)

我们可以看到,对于这种模式,不就是动态数组嘛,它们的形式是一样的,访问的时候,a和b可以通过指针的下标访问。

另外就是,由于获取的是指针,也就是地址,而且还不是结构体指针,而是与结构体内元素类型一致的指针,所以,也没有办法通过结构体的方式访问。

从底层来说,这种方式是可行的!需要明白,传参之后,结构体其实在函数set_gate中是看不见的,是消失的

【C language】动态数组的创建和使用相关推荐

  1. C语言——动态数组的创建和使用

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  2. c语言中创建一个整数数组_VBA中动态数组的创建及利用方法

    大家好,后疫情时代一定会到来,各行各业,都将是一场战胜萧条的无声的战役.无论怎样,我们一定要坚信,疫情终将会过去,曙光一定会到来.后疫情时代将会是一个全新的世界,很多理念都将被打破,大多数人不会再享受 ...

  3. c语言动态数组的创建

    用变量n如何创建a[n]呢? 首先,对于动态数组,大多数人初学时可能是这种情况: scanf("%d",&n); int a[n]; 当然,这种方法是不对的. 因为在程序运 ...

  4. C++动态数组的创建

    动态数组,利用new为整型指针开辟一个任意输入的n的大小的空间,使用完成之后利用delete []p 去释放这个空间.这种方法解决了我脑子里已知不能使用动态数组的疑惑. #include <io ...

  5. c语言2维动态数组的创建,如何创建一个动态2维数组?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include void **darray_new(int row,int col,int size_t){ voi ...

  6. c语言2维动态数组,如何创建一个动态2维数组?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include void **darray_new(int row,int col,int size_t){ voi ...

  7. c++动态数组的优点,创建和删除

    动态数组可以有两种使用方式: 1:不能预先知道数组的大小使用动态数组 传统数组(静态数组)是需要在程序运行前,就指定大小,比如说 int i = 10; int a[i]; 这种就是不合法的. 因为函 ...

  8. C++中关于[]静态数组和new分配的动态数组的区别分析

    一.静态数据及动态数组的创建 静态数据: int a[10]: int a[]={1,2,3}; 数组的长度必须为常量. 动态数组: int len; int *a=new int [len]; de ...

  9. [unreal4入门系列之十五] UE4中的动态数组:TArray容器

    为什么使用UE4提供的容器类? 如果你用过C++的STL库,你就知道STL提供了各种各样的容器/数据结构,使得你对处理很多数据的时候非常快捷高效.UE4同样也提供了类似的库,库里面的类型是以T开头的, ...

最新文章

  1. 搭建nginx服务器及文件的配置
  2. wxml修改样式_微信小程序 动态绑定事件并实现事件修改样式
  3. 使命召唤ios_使命召唤的精巧UI:战地
  4. 使用Zipkin和Sleuth进行SpringBoot微服务跟踪
  5. LeetCode 2135. 统计追加字母可以获得的单词数(位运算+哈希)
  6. Redis学习---(9)Redis 列表(List)
  7. 美团正押注无人车?没错,这是外卖大战的第三阶段
  8. mysql大于等于怎么写_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...
  9. 基于ssh人事考勤管理系统
  10. Python包和模块的区别
  11. 关于货币流动的一点思考
  12. UVA - 12235 Help Bubu 概率dp 状态压缩 记忆化搜索
  13. 7---可变参数+Collections集合工具类+冒泡排序+Map集合
  14. whai is gradient vanishing and exploding ?
  15. eclipse建web工程的dynamic web module version 具体是什么意思
  16. 支付分账的体系包含哪些?
  17. 如何消除自激振荡(硬件每日一题)
  18. 2020年南京大学软件工程考研上岸经验帖
  19. python常用PEP收集
  20. 《实战数据库营销——大数据时代轻松赚钱之道》新书试读+文摘

热门文章

  1. JAVA 常用框架和工具
  2. Adroid学习之 从源码角度分析-禁止使用回退按钮方案
  3. [蓝桥杯历届试题] 欧拉与鸡蛋
  4. 神奇的LINQ ---可以通过对象来查询数据
  5. 调整Tomcat上的参数提高性能[转]
  6. 小学计算机课5年级第一课,人教版(2015)小学信息技术 五年级下册 第1课 录制声音真轻松 教案...
  7. z490 linux raid,华硕z490主板装win7系统及bios设置教程(支持10代usb驱动)
  8. form字体和颜色java安卓开发_Android 修改App中默认TextView的字体和颜色
  9. 2pin接口耳机_拆解报告:雷柏首款真无线耳机XS200
  10. java自己实现ioc_springioc原理、springmvc项目分析、自己实现IOC