分享一道面试题(南京中兴通讯)

面试卷开头有说明,默认32位CPU,小端模式(。。。我就错在这里)。

题目大意是这样的,给你4个文件,问输出。

des.h 文件如下:

#ifndef _DES_H_
#define _DES_H_

#pragma pack(1)

#include "def.h"

#endif

des.c 文件如下:

#include "def.h"
#include "des.h"

g_Test gTestSrc={1,2,3};

def.h 文件如下:

#ifndef _DEF_H_
#define _DEF_H_

typedef struct
{
	int A;
	char B;
	short C;
}g_Test;

#endif

def.c 文件如下:

#include <stdio.h>
#include <string.h>
#include "des.h"
#include "def.h"

extern g_Test gTestSrc;
g_Test gTestDes;
  
int main(int argc, char** argv)  
{  

    memcpy(&gTestDes, &gTestSrc, sizeof(g_Test));
    printf("0x%X, 0x%X, 0x%X\n", gTestDes.A, gTestDes.B, gTestDes.C);
    return 0;  
}

如果你想自己试试就先不要往下看了,因为下面是我的解题思路,哈哈。

其实看完题目我的第一反应是:哪个傻X写的代码?

细心一点的应该都能看出来两个.c文件对头文件的引用顺序不一样。

des.c 中的 g_Test 应该是按默认的4字节对齐,也就是说 gTestSrc 的大小是 8 bytes。

def.c 中的 g_Test 是按1字节对齐,gTestDes在大小是 7 bytes。

关键是,默认小端模式的话,gTestSrc 在内存中是  01 00 00 00 02 00 03 00     (以上看不懂的自行百度,能上Google更好)

memcpy 把 gTestSrc 前7个字节复制到 gTestDes 中

gTestDes 在内存中是 01 00 00 00 02 00 03

gTestDes.A = 0x 00000001

gTestDes.B = 0x 02

gTestDes.C = 0x 0300

我没考虑大小端,想当然的按  00 00 00 01 00 02 00 03 算出 gTestDes.C = 0x0 ......

你可能感兴趣的:(分享一道面试题(南京中兴通讯))