C 语言编译过程 C语言中各种数据存储的不同内存区域 关于sizeof 结构体比实际的大的问题

本文详细介绍了C语言的编译过程,包括预处理、编译、汇编及链接四个阶段,并阐述了不同类型的变量如何存储在栈、堆、data、bss和rodata等不同的内存区域中。此外,还探讨了结构体内存对齐问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言
一  C 语言编译过程
   第一步  预处理   将.c文件处理成.i文件
 第二步 编译(调用C编译器) 将.i  编译成汇编的.s文件
 第三步 汇编(调用汇编器) 将.s编译成可重定向的.o文件
 第四步 链接 (调用连接器) 将main.o hello.o以及必要的系统目标文件链接组合,生成一个可执行的目标文件.out;(假设源文件中有main.c hello.c main.h 等)

二 C语言中各种数据存储的不同内存区域

————————————————————————
  栈    (参数,局部变量)

______________________________________

共享库
——————————————-————————
  堆   (malloc() free() realloc()  动态分配的内存)
————————————————————————
data   (全局变量 ,static修饰的局部变量   初始化了变量)
——————————
bss段            (全局变量  未初始化)

——————————————————————————
rodata         ( 字符串常量   如 char *a = "hello"; )
————————————————————————————
text  段   (存储程序指令)
————————————————————————————
三 关于sizeof 结构体比实际的大的问题

  举个例子 
struct T
{
      char ch;
      double d;
}
struct T k;
sizeof(k) 的值是多少?  一般认为 在32位机中,char 展1字节double占 8字节,则值应该是9字节,GCC编译之后,答案是12
原来实际的计算机系统存储时有“内存对齐”的要求,即存储的首地址有要求,GCC 最大对齐是4,即上边的char由于和double在一起被提成4;
  各种类型所占内存大小
                     32位            64位
     char       1                  1
     int           4                 4
  long            4                8
 long long     8                8
 char *          4                8
float             4                 4
double         8                8
 其中 指针类型和内存寻址范围有关;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值