当前位置:网站首页>【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中是看不见的,是消失的。
边栏推荐
- End-to-End Object Detection with Fully Convolutional Network学习笔记
- Netscope: Online visualization tool for neural network structures
- golang 三种指针类型具体类型的指针、unsafe.Pointer、uintptr作用
- String类型的字符串对象转实体类和String类型的Array转List
- C语言数组题_校门外的树_标记法
- 在线编译matlab,亲测好用
- margin出bug---margin失效
- 学习阶段总结(背包问题)
- matlab图像分割,从基因芯片荧光图像中提取阴性点(弱)和阳性点(强)
- 性能测试(03)-JDBC Request
猜你喜欢

OpenSSF's open source software risk assessment tool: Scorecards

People | How did I grow quickly from programmer to architect?

Qt读写.ini配置文件

性能测试(01)-jmeter元件-线程组、调试取样器

1009 Product of Polynomials C语言多项式乘积(25分)

Preparation for gold three silver four: how to successfully get an Ali offer (experience + interview questions + how to prepare)

Quartz的理解

Error: Cannot find module ‘./application‘

基于STM32F103移植FreeRTOS

美的数字化平台 iBUILDING 背后的技术选型
随机推荐
Numpy常用操作博客合集
二叉树 前序是根在前(根左右)中序(左根右)
PTA习题 阶梯电价(C)
1008 Elevator (20分)
美的数字化平台 iBUILDING 背后的技术选型
CentOS6.5 32bit安装Oracle-11gR2步骤说明
∘(空心的点乘)的数学含义
我用开天平台做了一个定时发送天气预报系统【开天aPaaS大作战】
Looper 原理浅析
人物 | 从程序员到架构师,我是如何快速成长的?
Product Quantization (PQ)
实测办公场景下,国产远程控制软件的表现力如何?(技术解析)
Tensorflow realize parameter adjustment of linear equations
Julia资料收集
Quartz的理解
Official explanation, detailed explanation and example of torch.cat() function
TensorFlow: NameError: name 'input_data' is not defined
依赖注入(Dependency Injection)框架是如何实现的
torch.stack()的官方解释,详解以及例子
性能测试(01)-jmeter元件-线程组、调试取样器