您的位置:首页 > 编程语言 > C语言/C++

C语言的强符号和弱符号深入理解

2016-11-05 12:21 232 查看
在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   计算结果
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息