程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第一百二十三回:C語言實例--顯示變量和函數的地址)

一起talk C栗子吧(第一百二十三回:C語言實例--顯示變量和函數的地址)

編輯:關於C語言

一起talk C栗子吧(第一百二十三回:C語言實例--顯示變量和函數的地址)



各位看官們,大家好,上一回中咱們說的是多線程的例子,這一回咱們說的例子是:顯示變量和函數的地址。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

在編寫程序時,有時候需要獲取程序中變量和函數的地址,今天我們就來介紹下如何獲取它們的地址。

獲取變量的地址

獲取變量的地址時,只需要使用取地址符對變量直接操作就可以。例如:int a = 1;那麼變量a的地址就是&a.該方法適用於大部分變量,不過還有一些特殊的變量不能使用該方法。接下來我們分別介紹如何獲取這些特殊變量的地址。

獲取數組變量的地址

數組本身就是一個地址,因此直接輸出就可以,不需要再使用取地址符對它操作。例如int set[3],直接在程序輸出 set的值就可以,它就是該數組的地址。

獲取字符串變量的地址

字符串變量和數組類似,它本身也是一個地址,因此,不需要再使用取地址符對它操作。例如char *pStr=”string”。直接輸出pStr的內容就可以,它是字符串string的地址。

獲取函數的地址

函數的地址也比較特殊,函數名本身就代表了函數的地址,可以直接輸出。或者定義一個函數指針間接輸出函數的地址。函數比較長,因此不再直接舉例子說明,請大家參考下面代碼中的例子。

看官們,下面是詳細的代碼,請大家參考。

#include

int hello()
{
    printf("hello \n");

    return 0;
}

int show()
{
    printf("show function is running \n");

    return 0;
}
int main()
{
    int a = 1;
    int set[3];
    char *pStr = "string";
    int (*pFunc)() = hello;

    printf("address of a :%p \n",&a);            //顯示變量的地址
    printf("address of set :%p \n",set);         //顯示數組的地址
    printf("address of string:%p \n",pStr);      //顯示字符串的地址
    printf("address of Function:%p \n",pFunc);   //通過函數指針顯示函數的地址
    printf("address of show :%p \n",show);       //直接顯示函數的地址

    return 0;
}

在上面的例子中, 我們通過printf函數的p參數直接輸出的地址值。下面是程序的運行結果,請大家參考:

address of a :0xbfce7a18 
address of set :0xbfce7a24 
address of string:0x80485d1 
address of Function:0x804844d 
address of show :0x8048466 

另外,除了在程序中直接輸出地址值外,我們還可以在調試程序時查看函數的地址,我們可以使用GDB調試工具來查看函數的地址。具體方法如下:

1.編譯時使用-g參數加入調試信息(gcc -g file.c -s out); 2.使用GDB進行調試,然後開始運行調試(gdb out , start); 3.使用GDB的info命令查看函數地址(info address function);

下面是一個具體的例子,例子中使用GDB對剛才的程序進行調試:

gcc - g show_address.c -o s                //編譯時加入調試信息
gdb s                                      //使用GDB進行調試
GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from s...done.
(gdb) start 
Temporary breakpoint 1 at 0x8048488: file show_address.c, line 18.
Starting program: /home/talk_8/C_Example/s 

Temporary breakpoint 1, main () at show_address.c:18
18      int a = 1;
(gdb) info address hello                  //顯示函數hello的地址
Symbol "hello" is a function at address 0x804844d.
(gdb) info address show                   //顯示函數show的地址
Symbol "show" is a function at address 0x8048466.
(gdb) info address main                   //顯示主函數main的地址
Symbol "main" is a function at address 0x804847f.

各位看官,關於顯示變量和函數地址的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved