Linux C语言指针与内存

  再学C语言,复习&笔记。

系列顺序: Linux C语言编程基本原理与实践 Linux C语言指针与内存 Linux C语言结构体

更多Linux知识: 一天一点linux


slug: 4voLNfuD aliases: [‘2018/07/20/Linux C语言指针与内存/’] title: Linux C语言指针与内存 字数统计: WordCount date: 2018-07-20 23:31:33 updated: 2018-07-22 23:44:10 tags: [Linux, C] categories: 编程语言

内存分配

系统内核(48位以上) 栈(暂时存储首先执行的程序状态) 自由可分配内存(可动态分配内存) 堆 数据段(声明一些全局变量或者声明一些常量) 代码段(程序源代码编译后存放在此)


C语言语法是不允许直接操作代码段的。 函数调用信息保存在栈(stack)中。

变量的本质是什么? 变量名它只是一个代号,变量的本质就是内存。 指针保存的是什么? 指针保存的就是内存地址。

int *pa=&a 指将a的地址传给pa。 p pa看到的是a的地址(&a)。 p &pa才能看到pa本身的地址。

GCC会对内存变量分配进行优化:同一种变量类型会放到一块儿。 静态变量、常量、全局变量存于内存的数据段(数据段位置高于代码段)。 栈区域(最接近系统控制的内存空间)保存的是函数的运行状态:函数执行到哪一个命令?每一个变量保存的什么值?等等。

地址分配:代码,数据段是从下往上分配(先低地址,后高地址),即:先声明的函数地址小,后声明的函数地址大;栈是从上往下分配(先高地址,后低地址)

函数中静态变量、局部变量区别: 局部变量在栈(相对数据段而言的高地址)中,而静态变量在数据段(低地址)中。 所以在多次调用函数时,静态变量不会被重新初始化。或者这么说,静态变量的生存周期和数据段相同,局部变量生存时间受调用函数时,所属函数进栈出栈的影响而会重新初始化。 全局变量和静态变量都在数据段中,但静态变量是某个函数特有的。

函数指针

函数指针格式: 返回值类型 (*变量名)(形参列表); p pa指找到数据的内存地址(a的地址); p *pa指找到pa中的数据; p &pa指找到pa本身的地址。 quadrate在代码段时, p quadrate 函数的内存地址(quadrate ) p *quadrate 在地址前加*,表示通过地址取值 int quadrate(int a);是一个函数 int (*pquadrate)(int a)=&quadrate;则是指向这个函数的指针 int s=(*pquadrate)(a)可以调用函数

字符串与数组

x/3d 地址 gdb调试打印内存:x代表打印,3代表打印长度,d代表十进制输出 例: x/3d 0x7fffffffde14 x/6cb c:字符形式 :b byte为单位

数组是指针常量,指针是指针变量。 数组当作内存地址输入的话,可以直接当作参数传进去,不用加&取址符。

栈内存中,gcc编译会作内存优化:

  1. 使同一数据结构的变量在一起;
  2. 先定义的变量内存地址会小于后定义的;
  3. 只有堆内存和栈内存可以写入数据,代码段的内存编译以后无法修改。 例: char *str=“world”; scanf("%s", str); 将报错。因为"world"是一个常量,在代码段中,不可更改。 char str[]=“hello”; scanf("%s", str); 正确。str在栈或堆中,可修改。
Licensed under CC BY-NC-SA 4.0
最后更新于 0001-01-01 00:00 UTC
使用 Hugo 构建
主题 StackJimmy 设计