• Linuxc


    指针实现变量交换值

    #include <stdio.h>
    void change(int *a,int *b) {
        int tmp = *a;
        *a = *b;// 将指针a所在地址的值,更换为b地址的值
        *b = tmp;
    }
    
    int main()
    {
        int a=5;
        int b=3;
    
        change(&a,&b); // 指针a获取a的地址,指针b获取b的地址
    
        printf("num a=%d
    num b=%d 
    ",a,b);
        return 0;
    }
    
    

    让我们用gdb工具来看看其中的奥妙。

    root@jiqing:~/cspace/pointer# gcc -g main.c -o main.out
    

    生成gdb调试版本的main.out文件。

    root@jiqing:~/cspace/pointer# gdb main.out
    

    进入调试模式

    (gdb) l
    1	#include <stdio.h>
    2	void change(int *a,int *b) {
    3		int tmp = *a;
    4		*a = *b;// 将指针a所在地址的值,更换为b地址的值
    5		*b = tmp;
    6	}
    7	
    8	int main()
    9	{
    10		int a=5;
    
    

    l 进行查看

    (gdb) start
    Temporary breakpoint 1 at 0x4005cb: file main.c, line 9.
    Starting program: /root/cspace/pointer/main.out 
    
    Temporary breakpoint 1, main () at main.c:9
    9	{
    
    

    start 开始执行

    (gdb) n
    10		int a=5;
    
    

    n 下一步

    (gdb) n
    13		change(&a,&b); // 指针a获取a的地址,指针b获取b的地址
    (gdb) s
    change (a=0x7fffffffe4d0, b=0x7fffffffe4d4) at main.c:3
    3		int tmp = *a;
    
    

    s 进入子函数

    (gdb) p a
    $1 = (int *) 0x7fffffffe4d0
    (gdb) p b
    $2 = (int *) 0x7fffffffe4d4
    
    
    (gdb) p *a
    $5 = 3
    (gdb) p *b
    $6 = 5
    

    p 打印值。经过交换之后,a变成了3 ,b变成了5。

    (gdb) q
    A debugging session is active.
    
    	Inferior 1 [process 11754] will be killed.
    
    Quit anyway? (y or n) y
    
    

    q退出。

    通过gdb可以一步一步的查看程序的执行情况,看到内存的值。
    窥探程序执行的奥秘。

  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/8337046.html
Copyright © 2020-2023  润新知