【大纲】
第一题:
【原题】
用C语言写一个打印字符串“HelloWorld”的程序
【解答】
#include<stdio.h>
int main() {
printf("HelloWorld\n");
return 0;
}
【拓展】
- 字符(串)在多字节和宽字节编码规范下的区别【char和wchar_t】
- 字符和数字的转换
- ‘0’、0‘\0’、NULL的区别
- 格式化字符串:%c、%d、%s、%u、%x、%o、%p、%f、%n
- printf()的安全问题——“心血漏洞”;
6.“%n”的问题
7.main()函数的问题
第二题
【原题】
请写出下面C语言类型的长度(单位为字节)
sizeof(char)
sizeof(short)
sizeof(int)
sizeof(long)
sizeof(long long)
sizeof(double)
【解答】
【拓展】
- sizeof是一个函数吗?
- 关于“sizeof”,下面哪些写法是不合法的:
3. sizeof和strlen的区别
第三题
【原题】
计算下面结果,并说明理由
typedef struct a {
char a1;
long a2;
char a3;
double a4;
}A;
typedef struct b {
char b1;
char b2;
long b3;
double b4;
}B;
【解答】
【拓展】
1.字节对齐(自然对齐)
为何要字节对齐【为了提高cpu读取数据的速度】
结构体字节如何对齐【原则1:某变量在内存中的存储位置的地址需要是该变量长度(以字节为单位)的整数倍;原则2:最后总的结构体大小应该是该结构体内最大变量长度的整数倍】
2.自定义对齐方式
#pragma pack(X) //X为要自定义的数据宽度(以字节为单位)
3.栈对齐
X86平台下按4个字节对齐;X64平台下按8字节对齐,并且总的大小按16字节对齐
第四题
【原题】
分析下面程序中每个变量的存储位置,作用域,生命周期
int a = 0;
char* p1;
static int x = 10;
void main() {
int b = 0;
char s1[] = "123";
char* p2;
char* s2 = "123";
static int c = 0;
p1 = (char*)malloc(128);
p2 = (char*)malloc(256);
free(p1);
free(p2);
}
【解答】
变量 | 存储位置 | 作用域 | 生命周期 |
a | 全局(静态)区(.data) | 整个项目文件 | 整个程序 |
p1 | 全局(静态)区(.bss) | 整个项目文件 | 整个程序 |
x | 全局(静态)区(.data) | 当前源文件 | 整个程序 |
b | 栈 | 所在函数 | 所在函数执行期间 |
s1 | 栈 | 所在函数 | 所在函数执行期间 |
p2 | 栈 | 所在函数 | 所在函数执行期间 |
s2 | 栈 | 所在函数 | 所在函数执行期间 |
c | 全局(静态)区 | 所在函数 | 整个程序 |
【拓展】
1.内存
1.有了全局变量,为何还需要全局静态变量【为了解决命名冲突的问题】
2.指针在X86平台下占4个字节,在X64平台下占8个字节
3.内存的寻址模式
逻辑地址、线性地址、物理地址
4. PE文件结构
第五题
【原题】
(char)(127 << ) + 1 =
(char)(-1 >> ) + 1 =
1 << 2 + 3 =
15 & 240 =
(char)(-128 * -1)
2017`2017=
20170304`0=
(0x12345678>>24)&0xFF=
0x12345678|`0xFFFEFFFF=
任意进制转换
【解答】
略
【拓展】
- 补码