当前位置:  技术问答>linux和unix

奇葩但是有助于理解的问题,,关于c的

    来源: 互联网  发布时间:2017-05-28

    本文导语:  两个文件,main.c和def.c 分别是: main.c #include  extern int i; void main() {     printf("%dn", sizeof(i)); } def.c char i = 'a'; /* 就一行 */ 然后 gcc main.c def.c -o main ./main 1.请问得到什么? 2.这个i最终是什么类型的变量,占...

两个文件,main.c和def.c
分别是:
main.c
#include 
extern int i;
void main()
{
    printf("%dn", sizeof(i));
}
def.c
char i = 'a'; /* 就一行 */
然后 gcc main.c def.c -o main
./main
1.请问得到什么?
2.这个i最终是什么类型的变量,占几个字节?

|
楼上说的对, sizeof 是个编译时期的operator, 在生成的binary中其实根本不会有对i的引用
楼主的code其实等同于
extern int i;
printf("%dn", sizeof(int);

或者进一步,等于
printf("%dn", 4)
生成的binary里面会有一个hardcode的 4

至于说i究竟是什么, 答案很简单,i只有一个,是一个char,大小是1,不过你extern它是什么,extern的那个模块就会当它是什么类型,变量不过是一个地址, 你愿意怎么用就怎么用

下面这个例子可以看到你拿i当int的时候是如何跨界访问的

  1 #include 
  2 extern int i;
  3 int main()
  4 {
  5   printf("%dn", sizeof(i));
  6   printf("%d, 0x%xn", i, i);
  7   return 0;
  8 }

  1 char i = 'a';
  2 char i1='c';

$g++ -o r g.C h.C
$./r
4
25441, 0x6361


|
应该是这样 sizeof 是编译时计算的,所以只会按照你c 中声明的类型计算

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3