【C language】动态数组的创建和使用
在C語(yǔ)言中,使用malloc函數(shù)創(chuàng)建動(dòng)態(tài)數(shù)組,使用一個(gè)指針指向它,使用下標(biāo)進(jìn)行訪問(wèn)。
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);上述例子,申請(qǐng)了兩個(gè)int空間的動(dòng)態(tài)數(shù)組,使用int *指向它,使用a[0],a[1]訪問(wèn),這與數(shù)組訪問(wèn)一樣,區(qū)別就是動(dòng)態(tài)申請(qǐng)內(nèi)存在堆空間,還需要使用free進(jìn)行釋放,而一般的數(shù)組在棧空間,自動(dòng)釋放。
這個(gè)很容易,這里想延申類比一下,這是Liunx 0.11內(nèi)核類似的一段代碼很有趣。
#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; }這個(gè)例子比較奇怪,奇怪在結(jié)構(gòu)體的訪問(wèn)上。
我們知到,一般結(jié)構(gòu)體變量是使用.,結(jié)構(gòu)體指針使用->訪問(wèn),這種使用下標(biāo)的挺詭異的,我們分析一下。
我們可以看到,對(duì)于這種模式,不就是動(dòng)態(tài)數(shù)組嘛,它們的形式是一樣的,訪問(wèn)的時(shí)候,a和b可以通過(guò)指針的下標(biāo)訪問(wèn)。
另外就是,由于獲取的是指針,也就是地址,而且還不是結(jié)構(gòu)體指針,而是與結(jié)構(gòu)體內(nèi)元素類型一致的指針,所以,也沒(méi)有辦法通過(guò)結(jié)構(gòu)體的方式訪問(wèn)。
從底層來(lái)說(shuō),這種方式是可行的!需要明白,傳參之后,結(jié)構(gòu)體其實(shí)在函數(shù)set_gate中是看不見的,是消失的。
總結(jié)
以上是生活随笔為你收集整理的【C language】动态数组的创建和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 全优7笑果剧情介绍
- 下一篇: x86异常处理与中断机制(2)中断向量表