联发科笔试题

知识盲区太多,只能慢慢补!

1.sizeof 与 strlen

char str1[] = {‘a’,‘b’,‘c’,‘d’,‘e’,’\0’,‘f’};
char str2[] = “abcdef”;
char str3[][80] = {“C++”,“JAVA”,“C”,“PYTHON”};
char *ptr = “abcdef”;

知识盲区:
1.sizeof计算数组时得到的是数组的元素个数,如果有’\0’,将’\0’计入进去
strlen计算数组长度时得到的‘\0’前的元素个数,不将’\0’计入进去
2.sizeof计算指针时得到的是指针的大小,指针大小在32位和64位系统中不一样
strlen计算指针时得到的是指针指向的字符串中’\0’前的元素个数,strlen是以字节为单位,如果是二维数组,也是从一开始计算第一个’\0’前元素个数
3.一个字符串赋值给一个数组时,含义是将字符串按字节复制给字符数组,同时要在字符串后面增加一个’\0’
4.char str3[][80] = {“C++”,“JAVA”,“C”,“PYTHON”}; 含义:这个二维数组中有4个行,每个行是一个80字节的数组,每个行中的值分别为4个字符串。
char str3[][80] = {‘a’,‘b’,‘c’,‘d’};
含义:将字符abcd放置在二维数组中的第一个行
5.32位系统和64位系统在字符大小上的区别
32位系统 64位系统
long 4 8
void * 4 8

2.linux中字节对齐原则

字节对齐从来就没有真正理解过,这一次趁这次机会,好好理解了以下字节对齐:
设对齐字节数为n(n可以为4或者8),区别于32位系统和64位系统,Li表示结构体中每个对象的大小,MAX(Li)表示结构体中字节数最大的元素的大小。则字节对齐原则为以下三条:
1)结构体对象的起始地址能够被MAX(Li)所整除;
2)结构体中每个成员相对于起始地址的偏移量,即对齐值应是min(n,Li)的倍数,若不满足对齐值得要求,编译器会在成员之间填充若干个字节。
3)结构体的总长度值应是min(n,Max(Li))的倍数,若不满足总长度值得要求,编译器在为最后一个成员分配空间后,会在其后填充若干个字节。

你可能感兴趣的:(嵌入式软件工程师面试笔试)