在C中链接文件

时间:2019-03-22 23:40:44

标签: c linker

main.c:

long long int x=0;
int y;
int* pointer;
int func(int* p);

int main(int argc, char**argv) {
    int my_array[5];
    pointer=(int*)malloc(100);
    y=1;
    func(&pointer[0]);
    func(&y);
    printf("%d,%d\n",y,pointer[0]);
}

func.c:

double x;
int y=10;
int func(int* p) {
    static int s=0;
    s+=1;
    y+=1;
   *p=y+s;
    x+=0.25;
    printf("x=%f,s=%d\n",x,s);
}

链接文件main.c和func.c时,输出为:

x=0.25,s=1
x=0.500000,s=2
5,3

我了解输出的第一行,但是有人可以解释一下最后两行吗?

1 个答案:

答案 0 :(得分:0)

具有外部链接的全局变量可在多个源文件之间共享。

因此,当字符串“ y = 1;”时执行时,y的共享全局值从10更改为1。

x全局变量在“ main.c”中定义为“ long long int”,占用8个字节。但是,在“ func.c”中,x声明为double,这也需要8个字节。相同的8个字节的内存,但是它们在不同的翻译单元中的解释不同。

字符串“ static int s = 0;”定义在函数调用之间保留其值的变量。

第一次执行“ func”后:

---------------------|---------------------------------------------------------------
          x          |    0.25 (as double) 4598175219545276416 (as long long int)    
---------------------|---------------------------------------------------------------
          y          |         2        
---------------------|---------------------------------------------------------------
          s          |         1        
---------------------|---------------------------------------------------------------
      pointer[0]     |         3        
---------------------|---------------------------------------------------------------

第二秒后:

---------------------|---------------------------------------------------------------
          x          |    0.5 (as double) 4602678819172646912 (as long long int)    
---------------------|---------------------------------------------------------------
          y          |         5 (*p=y+s; where p=&y)        
---------------------|---------------------------------------------------------------
          s          |         2        
---------------------|---------------------------------------------------------------
       pointer[0]    |         3        
---------------------|---------------------------------------------------------------