当前位置:网站首页>【C language】动态数组的创建和使用
【C language】动态数组的创建和使用
2022-08-09 11:03:00 【XV_】
在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 = 256
printf("%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 200
return 0;
}
这个例子比较奇怪,奇怪在结构体的访问上。
main
函数调用了set_gate
函数,并且将idt[0]
的地址作为参数传了过去set_gate
函数获取了idt[0]
的地址之后,直接使用下标去访问结构体内的两个变量
我们知到,一般结构体变量是使用.
,结构体指针使用->
访问,这种使用下标的挺诡异的,我们分析一下。
- 结构体内的两个变量是连续的,都是
unsigned long
类型 - 现在有一个
unsigned long*
指针指向了结构体内第一个变量(默认指向开头)
我们可以看到,对于这种模式,不就是动态数组嘛,它们的形式是一样的,访问的时候,a和b可以通过指针的下标访问。
另外就是,由于获取的是指针,也就是地址,而且还不是结构体指针,而是与结构体内元素类型一致的指针,所以,也没有办法通过结构体的方式访问。
从底层来说,这种方式是可行的!需要明白,传参之后,结构体其实在函数set_gate
中是看不见的,是消失的。
边栏推荐
猜你喜欢
随机推荐
全网最简单解决OneNote中英字体不统一
Qt 国际化翻译
TensorFlow: NameError: name 'input_data' is not defined
c语言函数的递归调用(汉诺塔问题,楼梯递归问题等)
Open3D 点云平均点间距评估
MATLAB代码实现三次样条插值
∘(空心的点乘)的数学含义
程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果
Numpy常用操作博客合集
faster-rcnn learn
备战金三银四:如何成功拿到阿里offer(经历+面试题+如何准备)
Multi-merchant mall system function disassembly 26 lectures - platform-side distribution settings
STM32使用静态队列保存数据
OpenSSF的开源软件风险评估工具:Scorecards
乘积量化(PQ)
Error: Cannot find module ‘./application‘
PTA习题 分类统计字符个数(C)
电磁场与电磁波-场论基础
CSDN的markdown编辑器语法完整大全
基于STM32F103移植FreeRTOS