【大纲】

第一题:
【原题】
用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=
任意进制转换
【解答】
略
【拓展】

- 补码
"本文探讨了C语言的基础知识,包括打印字符串"HelloWorld"的程序,字符与字符串的编码,以及类型长度。同时深入讲解了内存管理,如sizeof运算符的应用,结构体的字节对齐规则,以及变量的存储位置、作用域和生命周期。此外,还涉及了位运算和内存寻址等概念,以及程序中涉及到的内存分配与释放操作。"
1873

被折叠的 条评论
为什么被折叠?



