【C language】動態數組的創建和使用

在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中是看不見的,是消失的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

x86異常處理與中斷機制(2)中斷向量表

補充&#xff1a;事件不僅包含中斷和異常&#xff0c;還包含系統調用&#xff0c;這個屬于用戶主動請求的事件。 上一節&#xff0c;只有一個溢出異常&#xff0c;那么&#xff0c;如果很多異常、中斷呢&#xff1f;&#xff08;中斷向量表&#xff09; 另外&#xff0c;之前0…

x86異常處理與中斷機制(3)中斷處理過程

上一節講完了根據中斷類型號找中斷服務程序的過程&#xff0c;現在著重說明一下更加完整的中斷處理過程吧。 本節以8086時代的中斷處理過程為例進行說明&#xff0c;主要分兩大部分 硬件處理軟件處理 需要注意&#xff0c;這不是絕對的&#xff0c;得看實際情況&#xff0c;…

Linux 0.11 內核解析:中斷相關(1)asm.s文件中斷處理分析

0 源代碼 有兩個版本的&#xff0c;一個是帶中文注釋&#xff0c;Intel格式的&#xff1b;一個是不帶注釋是AT&T格式的。 Linux 0.11 中文注釋版 Linux 0.11 源碼&#xff0c;基于《Linux內核完全注釋》趙炯 1 asm.s 文件 我們先假設該文件處理的中斷是無特權過渡的情況…

【精華文】C語言結構體特殊情況分析:結構體指針 / 基本數據類型指針,指向其他結構體

參考鏈接&#xff1a;Structure pointer pointing to different structure instance 注&#xff1a;可以查看此篇的問題和唯一的回復&#xff0c;那是相對正確的&#xff0c;不要看comment&#xff0c;有很多錯誤。 我是拒絕分析這種問題的&#xff0c;因為似乎沒有人會這么亂用…

enum in c language

今天說說C語言中的枚舉。 參考&#xff1a;Enumeration (or enum) in C 1 定義 定義一個枚舉類型很容易&#xff1a; enum aa { a1, a2, a3 };這里 enum是關鍵字aa是枚舉變量&#xff0c;也就是我們自定義類型a1,a2,a3是枚舉成員 然后怎么使用呢&#xff1f; 首先&#…

信號量SIGCHLD的使用,如何讓父進程得知子進程執行結束,如何讓父進程區分多個子進程的結束

本教程基于 Ubuntu 20.10 gcc 10.2.0. 示例程序如果不能正常編譯和執行&#xff0c;說明您系統和工具版本與我的不匹配&#xff0c;請自行查閱資料。 0 概述 先給出該信號的描述&#xff1a; SignalValueDescriptionSIGCHLD17Child status has changed (POSIX). Signal sent …

使用gdb調試多進程程序、同時調試父進程和子進程

參考: [1] GDB debugging multi-process programs [2] Debugging programs with multiple processes 根據這兩篇參考鏈接&#xff0c;完全可以實現使用gdb同時調試父進程和子進程。 接下來說明一下可能遇到的坑 gdb8.1版本有bug&#xff0c;設置完set detach-fork-on off&…

Linux安裝Ncurses庫

參考&#xff1a;How To Install Ncurses Library In Linux 針對Ubuntu說明一下&#xff1a; wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz&#xff0c;至于最新版本&#xff0c;自己看官網&#xff0c;修改一下版本號即可。tar xzf ncurses-6.2.tar.gzcd nc…

gdb 10.2的安裝

參考 [1] GDB-10.2 [2] README for GDB release 個人系統 Ubuntu20.10。 注意gdb10.2需要c11語法&#xff0c;需要安裝g 下載安裝包wget https://ftp.gnu.org/gnu/gdb/gdb-10.2.tar.xz解壓縮tar -xvzf gdb-10.2.tar.xz進入解壓之后的目錄mkdir buildcd build配置&#xff0c;…

gdb tui的使用

[1] GDB Text User Interface [2] GDB Text User Interface 簡單來說&#xff0c;進入gdb之后&#xff0c;使用ctrl x 2就足夠了。其他細節請參考上述鏈接&#xff0c;選一個就可以。

C語言中信號函數(signal)的使用

先來簡單談談C語言中的信號&#xff08;signal&#xff09; 首先&#xff0c;signal是C語言庫中的函數&#xff0c;它實際上是軟中斷&#xff0c;也就是軟件發出的終端&#xff0c;本質來說&#xff0c;類似于int n。 對于接收到該軟中斷信號的進程&#xff0c;就會停下手頭的…

UNIX哲學

參考&#xff1a; 對比Linux與Windows 使用Linux想要做某些事情的時候&#xff0c;就拆開想&#xff0c;想想我需要哪些功能&#xff0c;需要哪些工具&#xff0c;依次怎么執行&#xff0c;然后用管道建立連接&#xff0c;讓數據依次流過不同的工具&#xff0c;從而得到最終結果…

fork創建多個子進程

references: [1] how to create two processes from a single Parent [2] fork() in C [3] linux中fork同時創建多個子進程的方法 fork的本質&#xff0c;就是復制&#xff0c;把當前進程復制一份&#xff0c;然后兩個進程并發地執行fork后面的語句&#xff0c;區別就是&#x…

wait系統調用

reference:Wait System Call in C 只強調幾點&#xff0c;剩下的直接看參考鏈接內容就好了&#xff0c;不是偷懶&#xff0c;而是里面內容寫的很好了&#xff0c;沒必要再寫一遍了&#xff0c;這種東西就是單純的系統調用而已&#xff0c;理解了功能&#xff0c;就完事了&#…

Linux進程間通信:共享內存與管道

references: [1] IPC through shared memory [2] Inter Process Communication (IPC) [3] https://www.geeksforgeeks.org/pipe-system-call/ [4] watch command in Linux with Examples 參考鏈接1和2是介紹了共享內存IPC的簡單原理和相關系統調用的使用參考鏈接3是介紹了管道通…

find command基本使用

find命令通常用于根據文件名查找文件&#xff0c;這是最基本用法。 find [path] -name/-iname [filename] path寫要查找的路徑&#xff0c;自動遞歸查找filename寫文件名&#xff0c;可以使用通配符*還有其他什么的表達式 具體細節請man find查閱文檔。

正則表達式特別需要注意的點:“空“字符的匹配

在正則表達式中&#xff0c;[...]代表1個字符&#xff0c;不管里面有多少字符&#xff0c;最終這個東西的結果都是1個字符。 對于表達式[^a]表達的匹配除了a之外的字符&#xff0c;并且是1個字符。 需要注意的是&#xff0c;有些特殊字符是不會被匹配的。 我們看一個示例&am…

vim多列操作--插入/刪除

插入 How to insert text at beginning of a multi-line selection in vi/VimVim Commands 刪除 ctrl v使用上下左右鍵選中一片區域按d刪除

vim進行行內某部分的復制剪切粘貼

ctrl v使用方向鍵選中你要復制的部分 按d&#xff08;剪切&#xff09;或者按y&#xff08;復制&#xff09;再移動到你的目標位置&#xff0c;按p粘貼&#xff08;在正常模式下才行&#xff0c;如果不是&#xff0c;先按esc&#xff09; 這個過程與你操作word文檔的復制粘貼…

函數調用堆棧

基于孟寧老師的Linux內核分析 1 int g(int x){ 2 int y x 3;3 return y;4 }5 6 int f(int x){7 int z x 10;8 return g(z);9 }10 11 int main(){12 int a f(8) 1;13 return 0;14…