在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号。
对于它们,下列三条规则使用:
① 同名的强符号只能有一个,否则编译器报”重复定义”错误。
② 允许一个强符号和多个弱符号,但定义会选择强符号的。
③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个。
mian.c中
#include <stdio.h>
#include <stdlib.h>
int x = 10;//强符号 符号是global
int y = 10;
void test();
int main()
{
printf("&x = 0x%x\n", &x);
test();
printf("%d\n", x);//0 //思考的地方
printf("%lf\n", x);//0.000000 //编译器默认x就是整形的,就算打印lf也没用,相当于整形0强转为double的0
printf("%d\n", y);//1077149696 //思考的地方
double *p = &x;//直接取首地址 步长为8 的内存
printf("%lf", *p);//20.000000 //这里就能正常显示test中x = 20
system("pause");
}
func.c中
double x;//弱符号
void test()
{
//x += 50; //这里最好不用+= 因为原来的int x = 10 会被 10.0 覆盖 x的值就成了10.0 而且这里不是x变成了10.0,而是x与y共同的内存8字节
x = 20;//这里x是main中的x,但是赋值的类型确实依据这个文件中的double
printf("func:x = %d\n", x);//func:x = 0 //这里是正常的
printf("func:x = %lf\n", x);//func:x = 20.000000 //这里是正常的
}
/*
当执行第7行之后,x的内存就发生了变化
00 00 00 00 00 00 34 40 一字节16进制显示
00000000 00000000 00000000 00000000 00000000 00000000 00110100 01000000 转化为 2 进制
01000000 00110100 00000000 00000000 00000000 00000000 00000000 00000000 因为是小端字节序,所以我们重新排序 注意:01000000 00110100 00000000 00000000 刚好等于1077149696
0 10000000011 0100000000000000000000000000000000000000000000000000 第一位 正负 2-12位 指数 13-64 小数
0 1027 - 1023 0100000000000000000000000000000000000000000000000000
0 4 0100000000000000000000000000000000000000000000000000 最终变化
1.01*2^4 = 10100 = 20 计算结果
*/