前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两个超级有意思的C语言题目,很多人都一脸懵逼!

两个超级有意思的C语言题目,很多人都一脸懵逼!

作者头像
Power7089
发布2020-07-27 15:43:48
4570
发布2020-07-27 15:43:48
举报

1、关于编译期的sizeof

废话少说,直接上代码。

代码语言:javascript
复制
#include<stdio.h>
main()
{
    int i = 5;
    int j = 5;
    sizeof(++i);
    sizeof(j++);
    printf("i: %d     j: %d\n",i,j);
    return 0;
}

已知i=5,执行sizeof(++i)之后,i的值是多少?

这个问题虽然比较不起眼,但是比较细节。

sizeof() 是一个编译期间预处理就决定结果的操作,学过编译原理的朋友都知道,程序编译期间肯定不会动态执行语句,所以无论i++ 还是++i,都不会执行。程序运行时,sizeof() 函数的结果已经被静态编码进程序了,所以取出的数值就是 i = 5 的数值。

一句话总结,sizeof()中的语句永远不会被执行。所以以上的代码就相当于:

代码语言:javascript
复制
#include<stdio.h>
main()
{
    int i = 5;
    int j = 5;
    printf("i: %d     j: %d\n",i,j);
    return 0;
}

答案见文末。

2、关于结构体的对齐属性

请问以下代码的输出是什么呢?

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data{
     char a;
     int b;
};
int main()
{
    char* mem = (char*)calloc(1, 100);  //初始化两个void*指针
    struct data *dt;
    memset(mem, 'c', 1);
    memset(mem+1, 2, 1);
    memset(mem+2, 0, 99);

    dt = (struct data*)mem;
    printf("%c %d ", dt->a, dt->b);
    return 0;
}

很多人用这种方法给数据进行转换,想当然会认为认为dt->a 就是 'c', b在小端序机器上就是2,大端序机器上就是 0x02000000。

恩,还不错,知道大端序、小端序,但是答案还是错的。

struct dt 的size是8 byte (4 byte + 4byte),并不是 1 byte(char a) +4 byte (int b) = 5 byte, 因为结构体默认被对齐了,所以在 dt->a 后面会有三个byte的填充,如果直接使用强制转换,那么 dt->a 仍然会从内存中读取4个byte,但是由于 dt->a 的数据类型为char,因此只会显示出第一个字节也就是c。

因此以上的程序被执行的时候,变量在内存中的变化如下(mem只取前9个byte。

答案见文末。

答案

1 答案: 5 5

2 答案: c 0

(你答对了吗?)

就上面两个题目,面试的时候去问,相信大量的人回答不对。但是这两个问题其实也就是知道了也就知道了,并没有什么一锤定音的功能,万万不能用这些问题去评价某个人,它们只是检测一个人对C语言的熟悉程度而已。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员阿甘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档