一起talk C栗子吧(第一百二十三回:C语言实例--显示变量和函数的地址)



各位看官们,大家好,上一回中咱们说的是多线程的样例。这一回咱们说的样例是:显示变量和函数的地址。

闲话休提,言归正转。让我们一起talk C栗子吧!

在编敲代码时,有时候须要获取程序中变量和函数的地址。今天我们就来介绍下怎样获取它们的地址。

获取变量的地址

获取变量的地址时,仅仅须要使用取地址符对变量直接操作就能够。比如:int a = 1;那么变量a的地址就是&a.该方法适用于大部分变量,只是另一些特殊的变量不能使用该方法。接下来我们分别介绍怎样获取这些特殊变量的地址。

获取数组变量的地址

数组本身就是一个地址,因此直接输出就能够。不须要再使用取地址符对它操作。比如int set[3],直接在程序输出 set的值就能够,它就是该数组的地址。

获取字符串变量的地址

字符串变量和数组相似,它本身也是一个地址。因此,不须要再使用取地址符对它操作。比如char *pStr=”string”。直接输出pStr的内容就能够。它是字符串string的地址。

获取函数的地址

函数的地址也比較特殊。函数名本身就代表了函数的地址,能够直接输出。或者定义一个函数指针间接输出函数的地址。函数比較长,因此不再直接举样例说明。请大家參考以下代码中的样例。

看官们。以下是详细的代码,请大家參考。

#include<stdio.h>

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 <http://gnu.org/licenses/gpl.html>
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:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
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.

各位看官,关于显示变量和函数地址的样例咱们就讲到这里。欲知后面还有什么样例,且听下回分解 。

时间: 2024-11-03 01:25:25

一起talk C栗子吧(第一百二十三回:C语言实例--显示变量和函数的地址)的相关文章

一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)

各位看官们,大家好,上一回中咱们说的线程属性的例子,这一回咱们说的例子是:线程知识体系图.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中,我们将对这些知识进行总结,并且整理成一张知识体系图,方便大家掌握线程相关的知识. 下面是我们整理的知识体系图,请大家参数: 上图内容中的知识点都有相应的章回对应,下面是我整理的章回对应关系.为了大家方便,我设置了链接,大家可以直接点击链接跳到相应的章回中. 线程概念 线程概念:第一百零七回 线程标识

一起talk C栗子吧(第一百五十三回:C语言实例--socket通信地址系统调用一)

各位看官们,大家好,上一回中咱们说的是计算机中大小端的例子,这一回咱们说的例子是socket通信地址的系统调用 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面的章回中介绍了套接字的通信地址,这一回中我们将介绍操作套接字通信地址的系统调用.大家都知道套接字的通信地址与套接字的域有关,接下来,我们依据套接字的通信域分别进行介绍. AF_UNIX域的通信地址 AF_UNIX域的通信地址本质上是文件的目录,文件目录存储在本地计算机中,而且使用该域通信时,通信双方都位于同一台计算

一起talk C栗子吧(第一百六十三回:C语言实例--三目运算符)

各位看官们,大家好,上一回中咱们说的是套接字知识体系图的例子,这一回咱们说的例子是:三目运算符.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前一章回中对套接字进行了归纳和总结,从而结束了对套接字的介绍.这一回中我们将开始介绍一个新的知识,那就是三目运算符. 说明到三目运算符,有些看官可能不知道是什么,如果我写个符号,大家一定都知道是什么"?:".啊!原来是它呀.已经有看官发出了感叹.其实,有时候我也会和大家一样,只知道使用,却不知道它叫什么,哈哈. 我们今天来介绍

一起talk C栗子吧(第一百三十三回:C语言实例--创建进程时的内存细节)

各位看官们,大家好,上一回中咱们说的是从内存角度看进程和线程的例子,这一回咱们说的例子是:创建进程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们都知道使用fork函数可以创建一个新的进程,今天我们一起说一下使用该函数创建进程时内存的一些细节问题.我们介绍的的重点还是内存布局中的四个分区. 1.在父进程中使用fork时,会创建一个新的进程,我们叫它子进程,子进程有自己的内存空间: 2.子进程的内存空间中没有代码区,子进程和父进程共享代码区: 3.子进程的内存空间中拥

一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)

各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就会提示,在某个文件的某一行有错误,这是怎么做到的呢?事实上是使用了C语言的内置宏. 说到宏,我想大家都知道,而所谓的内置宏相似于C语言的关键字,它是C语言自定义的,因此我们不须要定义宏,就能够直接使用.经常使用的内置宏有"_LINE_"和"_FILE_".假设把它们放到

第一百二十六节,JavaScript,XPath操作xml节点

第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准DOM去查找XML中的节点方式,大大降低了查找难度,方便开发者使用.但是,DOM3级以前的标准并没有就XPath做出规范:直到DOM3在首次推荐到标准规范行列.大部分浏览器实现了这个标准,IE则以自己的方式实现了XPath. 一.IE中的XPath 在IE8及之前的浏览器,XPath是采用内置基于A

一起talk C栗子吧(第一百二十六回:C语言实例--static关键字)

各位看官们,大家好,上一回中咱们说的内置宏的例子,这一回咱们说的例子是:static关键字.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,C语言提供了static关键字,它经常出现在变量或者函数的最前面,为什么要加上它呢?它主要有什么作用呢?今天我们一起来了解static关键字. 在介绍之前,我们先做一些铺垫.主要是介绍一下变量或者函数的生命周期和作用域. 变量和函数的生命周期 所谓的生命周期就是指变量或者函数在程序中可以被使用的时间,它是一段时间,可能是一分钟或者一小时等.生命周

一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)

各位看官们,大家好,上一回中咱们说的是基于AF_UNIX域的流套接字通信的例子,这一回咱们说的例子是:基于AF_UNIX域的数据报套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中一起制作了我们的第一道佳肴是:基于AF_UNIX域的流套接字通信.今天,我将和大家一起制作第二道佳肴:基于AF_UNIX域的数据报套接字通信. 制作第二道佳肴的菜谱:数据报套接字过程. 制作第二道佳肴的食材:数据报套接字的接口,套接字属性,套接字地址信息. 看官们,以上的内容,我们

一起talk C栗子吧(第一百三十七回:C语言实例--查看环境变量)

各位看官们,大家好,上一回中咱们说的是exec系列函数的例子,这一回咱们说的例子是:查看环境变量.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面介绍exec系列函数时提到过程序的运行环境,有些看官可能不太明白,今天我们一起来看看程序运行环境中的环境变量.环境变量在实际编写程序的时候经常使用,比如常用的PATH环境变量.有时候程序无法运行,就是环境变量错误引起的. 环境变量是操作系统提供的一种参数,程序可以通过这些参数来在操作系统中运行,它是本质上是键值对序列. 例如:SH