C基础1

基础知识:
生产一个可执行软件的主要过程(参考https://blog.csdn.net/weixin_41143631/article/details/81221777)
1.预编译:执行include文件展开、宏替换操作与立即数计算等等
2.编译:生产目标文件和符号表,这一过程是针对一个文件内部
3.汇编:汇编代码转换机器码
4.链接:根据符号表链接各文件之间的函数调用和数据访问等。

主要内存的划分
1.代码段:存放可执行语句和常量等,此区域不允许修改
2.数据段:存放经过初始化的全局变量、静态全局变量和静态局部变量等,属于静态内存分配
3.BSS段:存放未经过初始化的全局变量、静态全局变量和静态局部变量等,属于静态内存分配
4.堆:malloc的内存就是在此区域分配的(free释放该内存)
5.栈,存放函数的临时变量(局部变量和函数参数),以及函数调用过程中保存的上下文等。

各种变量的生存周期
1.全局变量,从main函数开始一直到main函数退出
2.静态全局变量,生命周期与全局变量一样,但是只能由定义此变量的文件内部访问
3.局部变量,从定义此变量开始,到该语句块对应的’}'弹栈截止
4.静态局部变量,生命周期与全局变量一致,但是可以访问他的语句范围与局部变量相同
5.函数参数,函数被调用的时候系统为此函数开辟栈空间开始,截止到函数退出系统弹栈

零散知识点
1.sizeof是操作符,所以是在预编译阶段计算出数值,strlen是函数,计算指定字符串 str 的长度,但不包括结束字符’\0’(http://c.biancheng.net/view/342.html)
2.宏定义是在预编译阶段以符号替换的方式展开的
3.C语言大小字母敏感

例子1:
//func.c
#include <stdio.h>
int a = 0; //a存在数据段,生命周期与main函数相同,可以被所有文件访问
static int a1 = 0; //a1存在数据段,生命周期与main函数相同,只可以被func.c文件内的代码访问
int b; //b存在BSS段,生命周期与main函数相同,可以被所有文件访问
static int b1; //b1存在BS段,生命周期与main函数相同,只可以被func.c文件内的代码访问
int func(int arg)
{
int c; //argc、c存在栈空间,生命周期与func函数相同,只可以被func函数内的语句访问
static int c1; //c1存在BSS段,生命周期与main函数相同,只可以被func函数内的语句访问
char *d; //d存在栈空间,生命周期与func函数相同,d指向的100字节存在堆空间,在free前都可以访问
d = malloc(100);
my_printf("%d%d%d\n",a , b, c);
free(d);
return 0;
}

例子2:
//a.c
int array[100];
//b.c
extern int array[];
sizeof(array);
问题:sizeof计算出大小为?
答案:编译不通过,sizeof是一个运算符,在预编译阶段计算数值,预编译阶段只针对b.c一个文件计算,extern int array[]并未指定具体大小,所以编译失败
修改extern int array[]为extern int array[100]可以计算出大小。

例子3:
//a.c
int array[200];
//b.c
extern int array[100];
sizeof(array);
问题:sizeof计算出大小为?
答案:计算出大小为100x(sizeof(int))即100x4,400字节,而a.c里实际大小为200x(sizeof(int))即200x4,800字节。

例子4:
最优写法:
//a.c
int array[ARRAY_LEN];
//b.c
extern int array[ARRAY_LEN];
sizeof(array);
使用宏定义保证a.c和b.c数组大小相同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值