当前位置: 技术问答>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最终是什么类型的变量,占几个字节?
分别是:
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
楼主的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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。