首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C語言獲取變量、數組、字符串、函數地址完全指南

     編輯:C 語言入門

在 C 語言中,獲取地址的方法因對象類型而異:普通變量用 &,數組/字符串/函數名本身即地址。本文系統總結各類對象地址獲取方法,並演示 GDB 調試驗證函數地址技巧。

地址獲取規則速查表

對象類型獲取方法示例本質
普通變量&var&a取地址運算符
數組arr 或 &arr[0]set數組名退化為首元素指針
字符串字面量"str" 或 pStrpStr存儲在只讀數據段的首地址
字符指針變量pStr(值即地址)pStr指針變量本身存地址
函數func 或 &funcshow函數名即代碼段入口地址
函數指針pFunc(值即地址)pFunc指針變量存函數地址

完整演示代碼

#include 

int hello() { printf("hello\n"); return 0; }
int show()  { printf("show running\n"); return 0; }

int main() {
    int a = 1;
    int set[3];
    char* pStr = "string";
    int (*pFunc)() = hello;  // 函數指針
    
    printf("address of a:      %p\n", (void*)&a);
    printf("address of set:    %p\n", (void*)set);
    printf("address of string: %p\n", (void*)pStr);
    printf("address of func*:  %p\n", (void*)pFunc);   // 通過函數指針
    printf("address of show:   %p\n", (void*)show);   // 直接用函數名
    
    return 0;
}

典型輸出(地址每次運行不同)

address of a:      0x7ffc12345678
address of set:    0x7ffc12345680
address of string: 0x555555556004
address of func*:  0x555555555149
address of show:   0x555555555162

GDB 調試驗證函數地址

# 1. 編譯帶調試信息
gcc -g addr_demo.c -o addr_demo

# 2. 進入 GDB
gdb ./addr_demo

# 3. 設置臨時斷點並運行
(gdb) start
Temporary breakpoint 1 at 0x...: file addr_demo.c, line 18.
Starting program: ...
Breakpoint 1, main () at addr_demo.c:18

# 4. 查看函數地址
(gdb) info address hello
Symbol "hello" is a function at address 0x555555555149.
(gdb) info address show
Symbol "show" is a function at address 0x555555555162.
(gdb) info address main
Symbol "main" is a function at address 0x55555555517f.

# 5. 也可打印函數指針值
(gdb) p hello
$1 = {int ()} 0x555555555149 
(gdb) p show
$2 = {int ()} 0x555555555162 

進階理解:地址空間佈局

  • 棧區:局部變量 a、set、pStr、pFunc(高地址向低增長)。
  • 只讀數據段:字符串字面量 "string"(地址較低,通常靠近代碼段)。
  • 代碼段:函數 hello、show、main(最低地址區域)。

理解地址分佈對調試棧溢出、緩衝區溢出、函數指針調用極有幫助。

常見誤區

  1. &set vs set:類型不同(int(*)[3] vs int*),但數值相同。
  2. &pStr 是指針變量自身的地址(棧上),非字符串地址。
  3. 函數名 show 可直接賦值給函數指針,&show 等價但較少用。

熟練掌握各類對象地址獲取方式,是 C 指針編程、調試分析、底層內存操作的基石技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved