为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
Linux C语言指针与内存_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

Linux C语言指针与内存

DavidChin
难度初级
时长 2小时 5分
  • 使用gdb要使用gcc -g a.c -o a.out
    查看全部
    0 采集 收起 来源:gdb工具的使用

    2016-10-24

  • 字符串指针(char *str)指向的字符串存放在代码段,而字符数组(char str[])的字符串存放在栈中。 代码段不能被修改,只有在栈内存或者堆内存的数据才能修改。
    查看全部
  • 5-3字符串数组和指针字符串 gdb: x/6cb,c:字符形式 :b byte为单位 堆和栈内存里才可以写入(预留空间才可写入)
    查看全部
  • 数组名称本身是一种指针常量,不可修改 int array[2]; int *p=array; array为常量指针,不可改变;p为变量指针,可以改变; 所以,array能做的事情,p也能做到,但反之则不行; PS:指针取值有两种方式,一种是*p,另一种是p[i] p[i]相当于以地址作为基点往下偏移i个变量地址 而赋值操作也可以由p+=3; *p=101;变成简单的p[3]=101;
    查看全部
    0 采集 收起 来源:指针运算

    2016-10-24

  • 工具gdb内的指令格式: x/3d 0×7ffffffde14 x/:表示连续输出地址内的值 3:表示输出3个地址内的值 d:表示连续输出的值用十进制表示 0×7fffffffde14:表示三个连续地址里的第一个地址
    查看全部
  • (gdb) n 36 int (*pquadrate)(int a) = &quadrate; // 定义函数指针 (gdb) 38 int s = (*pquadrate)(a); (gdb) s quadrate (a=3) at main.c:23 23 count++; (gdb) bt #0 quadrate (a=3) at main.c:23 #1 0x08048520 in main () at main.c:38 (gdb) p &a $1 = (int *) 0xbfffeff0 (gdb) f 1 #1 0x08048520 in main () at main.c:38 38 int s = (*pquadrate)(a); (gdb) p quadrate $2 = {int (int)} 0x804849a <quadrate> (gdb) p pa $3 = (int *) 0xbffff000 (gdb) p *pa $4 = 3 (gdb) p *pb $5 = 4
    查看全部
  • 栈,先进后出。内存地址由大到小。 (gdb) bt #0 rect (a=3, b=3) at main.c:16 #1 0x080484c5 in quadrate (a=3) at main.c:25 #2 0x0804851d in main () at main.c:37 (gdb) p &s $2 = (int *) 0xbfffefd0 (gdb) p &count $3 = (int *) 0x804a028 <count> (gdb) f 1 #1 0x080484c5 in quadrate (a=3) at main.c:25 25 int s = rect(a, a); (gdb) p &count $4 = (int *) 0x804a02c <count> (gdb) f 0 #0 rect (a=3, b=3) at main.c:16 16 int s = a * b; (gdb) p &global $5 = (int *) 0x804a024 <global> (gdb) f 1 #1 0x080484c5 in quadrate (a=3) at main.c:25 25 int s = rect(a, a); (gdb) p &global $6 = (int *) 0x804a024 <global>
    查看全部
  • cpu内存申请优化 指针类型的申请在基本数据类型申请之后。 指针 32位时 占用4个字节 指针 64位时 占用8个字节 CPU在编译的时候对栈内变量的存储地址进行优化,他会将类型相同的变量在连续地址中储存。 栈:保存 函数当前运行的状态,例如 函数内声明的变量、运行到哪个函数的第几行 等 数据段:存放 静态变量、全局变量、常量 代码段:存放函数 在代码段函数是从低地址向高地址存放的,先申请的函数地址小,后申请的函数地址大;栈中情况相反。 全局变量的地址在数据段,它的地址是唯一的。
    查看全部
  • 数据段
    查看全部
  • 变量名只是代号 变量的本质是内存 在标准的C语言中,不允许直接对内存地址进行操作,只能是对操作系统已经分配给的内存空间进行操作。(防止用户自己操作内存地址时侵吞系统内存或者其他程序的内存) p 指针指向的变量地址 *p 指针指向的变量值 &p 指针自己所在的地址 既然一个指针保存的是变量的地址,对32位CPU,地址有4个字节,就需要4个内存单元来存储,所以每次++p在内存里都是跳4格。 函数调用信息保存在栈(stack)中。
    查看全部
  • p;指针指向的变量地址 *p;指针指向的变量值 &p;指针自己所在的地址
    查看全部
  • a=b in gdb: p b refers to "a"'s address p &b refers to "b"'s address itself
    查看全部
  • After input:gcc -g main.c Then input:gdb ./a.out
    查看全部
  • 变量前加*号表示加入指针。 在main函数中引用指针时是变量前加&号
    查看全部
  • 静态变量 常量 全局变量 默认储存在数据段里 不同函数里的count(静态变量)是不同的count, 但同一个函数不管调用多少次count都是指向数据段中的某个地址
    查看全部

举报

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

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