• 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可以一步一步的查看程序的执行情况,看到内存的值。
    窥探程序执行的奥秘。

  • 相关阅读:
    audio之点击图标切换音频播放状态以及替换当前图标
    js之ajax的封装
    JavaScript之ajax的作用、流程以及如何设置请求头
    BFC的理解
    2016年总结
    如何用shared_ptr减少锁的争用
    webrtc初识
    2015总结与2016展望
    记一次程序排错与std::getline
    spawn协程学习
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/8337046.html
Copyright © 2020-2023  润新知