内存分配与编译处理

简介: 内存分配与编译处理

一、位操作


第n位清0:

a & (0x1<

第n位置1:

a | (0x1<

a为4字节大小,提取a的最低16位,其他位不变

a = a & 0x0000ffff

将a的20为位置置1,其他位保持不变

a = a | 0x00100000


二、格式符


image.png

%d一般是表示为32位,表示4个字节

所以%hd表示16位,既表示2字节

所以%hhd表示8位,既表示1字节

无符号用%u


三、ASCII表


image.png

0-9:48-57
A-Z:65-90
a-z:97-122


四、函数指针与指针函数


int (*p)(int);

int *p(int);

前者是函数指针,强调的是(P)指向一个函数,并且有一个传参是int型的

后者是指针函数,强调的是(int),定义一个函数,这个函数是一个指针的


回掉函数的用法

image.png

测试使用:

/*
*   以下是函数指针的使用
*/
#include<stdio.h>
void *func(int a,int b);
void *my_func(void *(*process_func)(int,int),char *ptr,int *data)
{
  char *my_func_str;
  int data1 = 11,data2 = 22;
  my_func_str = process_func(data1,data2);
  printf("\nparent\n");
  printf("ptr : %s,\tdata :%d\n",ptr,*data);
  printf("my_func_str :%s\n",my_func_str);
}
void *func(int a,int b)
{
  char *ptr="hello my_func";
  printf("child\n");
  printf("a:%d\tb:%d\n",a,b);
  printf("%d + %d = %d\n",a,b,a+b);
  return ptr;
}
int main()
{
  int data = 1000;
  char *ptr = "hello linux";
  my_func(func,ptr,&data);
  return 0;
}


五、内存分配


参考:https://blog.csdn.net/lewis_kuo/article/details/13020031


在采用段式内存管理的架构中(比如intel的80x86系统),一个程序本质上都是由 bss段、data段、text段三个组成的。


BSS段:BSS段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。一般在初始化时bss 段部分将会清零(bss段属于静态内存分配,即程序一开始就将其清零了)。


数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。


代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。


堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。


栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static局部变量意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。


bss段:存储未初始化的全局变量和为初始化的静态变量

data段:存储已初始化的静态变量和已初始化的全局变量

text段:代码段,存储代码

(变量存储在系统中)


六、编译处理过程


  1. 预处理阶段

还是c语言,只是把内容替换展开,比如#define的内容

gcc -E xxx.c -o xxx.i


  1. 编译阶段

编译成x86控制语句,c语言编程汇编语言

gcc -S xxx.i -o xxx.S

image.png


  1. 汇编阶段

汇编语言准换成机器语言(01语句)

gcc -c xxx.S -o xxx.o

image.png

查看二进制机器码

objdump -d macro.o


  1. 链接阶段

到库里面去把文件链接处理

gcc xxx.o -o xxx.elf


目录
相关文章
|
1月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
90 21
|
2月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
Java 开发工具 Maven
Android 编译 gradle 内存 OOM 解决之路(二)
Android 编译 gradle 内存 OOM 解决之路
|
Java Android开发
Android 编译 gradle 内存 OOM 解决之路(一)
Android 编译 gradle 内存 OOM 解决之路
|
Java Android开发
Eclipse编译项目内存溢出,修改配置
Eclipse编译项目内存溢出,修改配置
199 0
|
Android开发
【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
307 0
【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
安装PHP7.3.2make编译出现报错,内存不足导致,临时解决方法
安装PHP7.3.2make编译出现报错,内存不足导致,临时解决方法
284 0
|
C语言
【C 语言】数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )
【C 语言】数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )
267 0
|
JavaScript Java
ANGULAR 使用 ng build --prod 编译报内存错误的解决办法
如果你遇到如下的情况 [13724:0000020D39C660D0] 231298 ms: Mark-sweep 1356.3 (1433.6) -> 1356.3 (1433.6) MB, 1194.
2661 0