为了账号安全,请及时绑定邮箱和手机立即绑定

Linux C语言指针与内存

难度初级
时长 2小时 5分
学习人数
综合评分9.60
263人评价 查看评价
9.9 内容实用
9.5 简洁易懂
9.4 逻辑清晰
  • 不用指针时传递的是值,而使用指针时传递的是地址。使用&是传地址的,*是指针找到地址块
    查看全部
  • CPU用地址总线寻址,有多少地址总线,就有多少种状态,就能寻找和使用多大的内存 32bit CPU: 2^32 bit== 4GB 64bit CPU: 2^64 bit 内存分配 系统内核(48位以上) ------------------------------------------- 栈(暂时存储首先执行的程序状态) ------------------------------------------ 自由可分配内存(可动态分配内存) ----------------------------------------- 堆 ---------------------------------------- 数据段(声明一些全局变量或者声明一些常量) ---------------------------------------- 代码段(程序源代码编译后存放在此)
    查看全部
    3 采集 收起 来源:内存管理

    2016-10-25

  • 1.编译命令:gcc -g main.c -o main.out; 2.调试命令:gdb ./main.out; 3.调试器: (gdb)list:列出源代码,可以输入l或回车以继续显示; (gdb)break line-number:在指定行数打断点; (gdb)start:开启单步调试; (gdb)p a:打印a变量在内存中的情况; (gdb)n:执行到下一句; (gdb)bt:查看函数堆栈; (gdb)s:进入函数内部; (gdb)f 1:切换到编号为1的函数中; (gdb)q:退出调试;
    查看全部
    3 采集 收起 来源:gdb工具的使用

    2016-10-25

  • 变量前加*,为指针 &为取地址符
    查看全部
  • p;指针指向的变量地址 *p;指针指向的变量值 &p;指针自己所在的地址 既然一个指针保存的是变量的地址,对32位CPU,地址有4个字节,就需要4个内存单元来存储,所以每次++p在内存里都是跳4格。
    查看全部
  • 使用gdb调试步骤: 1、使用带-g选项的gcc命令编译源文件:gcc -g main.c -o main.out 2、使用gdb工具调试:gdb ./main2.out 3、调试过程中:(gdb): l 列出当前项目源代码(list)→再按l或直接按回车:继续执行上一命令 break 12 将断点打在第12行 start 单步调试 p a 显示当前a的值(print)(当前行的命令未完全执行) n 进入下一行(next) s 进入当前函数内部(step) bt 查看函数堆栈(在上方的函数先执行) f 1 切换到1号栈 q 退出调试
    查看全部
    2 采集 收起 来源:gdb工具的使用

    2016-02-01

  • 1. int quadraate(int a);是一个函数 int (*pquadrate)(int a)=&quadrate;则是指向这个函数的指针! int s=(*pquadrate)(a)可以调用函数! 2.一个指针变量*q 不加*号:P q 取出自己地址中存储的值(一个地址)。 加*号:P *q 取出指向地址中存储的值。
    查看全部
  • 自己的程序和老师完全一样但是输出结果不一样,原因是因为自己的系统和老师的系统不一样,我系统分配的顺序是array[0] array[1] array[2] a b i.如果想结果输出正确只需要改 p=array即可。每个人的系统不一样,输出结果不一样是很正常的,如果输出一些不可控的数据,可是因为你指针指向了为初始化的地址。
    查看全部
  • void change(int *a,int b)  其中a为指针参数,*+任意参数或者变量均为指针参数或者变量  在调用该函数时需要在参数前+& 即:  change(&a,&b);

    变量前加*号表示加入指针。 在main函数中引用指针时是变量前加&号

    int *a=&b; a是指针,把b的地址赋给a,a指向b

    &取地址符

    指针变量不赋初值会出错,temp


    查看全部
  • gdb 断点调试,单点调试

    gcc -g main.out -o   -g使用gdb编译

    gbd ./main.out  执行

    (gdb) l  或list  显示源代码

    回车继续执行刚刚的命令

    start开始执行

    print或p a 打印输出a

    n 跳到下一行

    s 进入函数

    bt 查看函数堆栈

    f 1 跳转到函数1

    q 退出调试

    查看全部
    2 采集 收起 来源:gdb工具的使用

    2019-06-11

  • 写写心得体会。

    char *str2 = "world";

    定义一个字符指针变量str2,

    在gdb中用「p str2」查询到str2所指向的值,在内存中的位置是在低地址位的代码段,

    而不是在高地址位的栈里面,结果是这样的:「$1 = 0x400774 "world"」。

    str2本身是指针,它本身的所在是在栈里面的,用「p &str2」来查询,得到「$2 = (char **) 0x7fffffffda98」。

    所以,如果用输入语句来试图对str2指向的地址赋值的话,是会出现「内存段错误的」!

    比如:「scanf("%s",str2);」,这样的语句运行时是会出现内存段错误的。

    原因就在于C语言不运行程序在运行中对内存中的代码段进行修改。

    再对输入语句进行深入剖析,比如有「int a; scanf("%d",a);」这样的语句,当输入整型数值时,数值被传入内存,保存到了变量a所在的地址,实际上就是变量a本身所代表的含义就是它自身所在的内存地址,所以数值传入给a,实际上是传入给a指向的地址,而a作为一个整型变量,它指向的地址就是它本身所在的地址,它是在内存中的栈里的,所以输入值、传入值,没有问题,不会出现内存段错误。

    但是,如果是像上面的把输入的字符串传入给字符指针str2的话,实际要执行的传入过程是把字符串传入到str2指向的地址,而这个地址是在内存的代码段里,这是不允许的,所以就会出现内存段错误!

    ++++++++++++++

    所以,对于指针变量,它在定义或初始化的时候,它的默认指向地址是在内存的「代码段」里的,也就是说,在这种情况下,对指针变量取值的话,得到的值实际上是从内存的「代码段」里取出来的,根据C语言的规定,当然就无法对这个值进行重新赋值了!

    所以,要改变指针变量所指向的内存的值,不能直接去对指针变量指向的值进行赋值,而是要改变指针的指向,也就是说,「要把地址赋值给指针变量」,而不是把值赋值给指针变量最初所指向的值。

    ++++++++++++++

    再贴一段助于理解指针的试验代码:

    #include <stdio.h>
    
    int main()
    {
            char a[10]="hello";
            char b[10]="world";
            char *c="81";
    
            printf("char *c=81, c is %s\n",c);
            
            c=&a;
            printf("c = &a,c is %s\n",c);
    
            printf("address of a is %d\n",a);
            printf("address of value pointed by c is %d\n",&(*c));
            printf("address of c itself is %d\n",&c);
            
            return 0;
    }

    输出结果如下:

    char *c=81, c is 81
    c = &a,c is hello
    address of a is -358473008
    address of value pointed by c is -358473008
    address of c itself is -358473016

    指针c本身也是在栈里面的,对c取地址的话取到的是c本身的地址,而要想取到c所指向的值的地址的话,要先对c取值,再对值取地址:&(*c)。

    查看全部
  • 使用调试功能 gcc -g

    gdb ./               //开始进行gdb调试

    list                   //列出程序

    start              //单步开始

    p                  //打印变量值

    n                 //继续执行

    s                //step 跳入函数

    bt              //查看函数堆

    f               //切换函数堆

    查看全部
    2 采集 收起 来源:gdb工具的使用

    2019-02-10

  • gdb 终端调试工具

    gcc -g main.c -o main.out 生成可调式的执行文件

    注意,此时源代码.c文件仍不可删除。否则仍然不支持调试。

    调制过程:

    1、 gdb  main2.c   进入调试模式;

    2、调试模式 输入  “list”  或者 “l”  列出当前项目的软件源代码;

    3、“start”  开始调试,默认断点在main函数的第一行代码;

    4、"p" 表示print , 输出变量值;

    5、“n" 表示执行一行代码挑到下一行;

    6、 “s” 表示按步骤执行代码, 可进入调用函数内部;

    7、“bt” 表示显示函数堆栈, 可显示有哪些函数在运行;此时使用"p"打印的是当前函数中的变量值, 即标号为#0的函数;

    8、"f" 切换当前跟踪的堆栈内函数; eg: f 1(1 为“bt”中的函数编号);

    9、“q”跳出调试模式;

    查看全部
    2 采集 收起 来源:gdb工具的使用

    2018-11-28

  • P[4]不是p往下面移动了4个位置,而是从p开始的地址往后移动4个位置取值,p指向的地址还是不变的
    查看全部
    2 采集 收起 来源:指针运算

    2017-10-16

  • gdb: x/6cb,c:字符形式 :b byte为单位 堆和栈内存里才可以写入(预留空间才可写入)
    查看全部

举报

0/150
提交
取消
课程须知
本课程是C语言中级课程,为了更好的学习效果: 1、需要有一定的C语言基础,如果没有基础的同学可以看《C语言入门》这门课。 2、本课程是在Linux环境下讲解,需要熟悉一些Linux命令。如果不了解的话可以在《Linux C语言编程基本原理与实践》这门课程中补充
老师告诉你能学到什么?
1、C语言中的指针是怎么回事 2、Linux下gdb调试工具是怎样使用的 3、指针与内存有着怎样的关系 4、数组与字符串之间的联系

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!