一、结构体是“组合”(各占各屋),联合体是“共用”(挤在一屋)。
二、结构体定义格式typedef sturct 结构名{};结构名后不加小括号。
三、E0065错误,在定义结构体后应加上“;”,
四、初始化通讯录时不用进行判断,直接置0
五、定义通讯录变量未contact con;而传出初始化函数Initcontact(),为指针,则用取地址符号&。
即Initcontact(&con);
六、scanf("%d\\n", &input);错误\\n不能写里面会导致程序无法往下执行。
七、if (strcmp(p->per[i].name, name)) 修改为
if (strcmp(p->per[i].name, name) == 0) { // 必须判断等于0
return i;
}。
八、若指针指向的元素内容为空NULL则表示分配内存失败,返回-1.
九、 exit(-1);exit(-1) = 给操作系统发信号:“程序出故障了,我立刻自杀!”
记住:exit 是终结整个程序,而 return 只是终结当前函数。
十、struct Person* new_arr = (struct Person*)realloc(ps->arr, new_capacity * sizeof(struct Person));
十一、free(ps->arr); // 释放堆上的数组
十二、这不是函数调用,而是函数声明(声明了一个名为 Checkcapacity、返回类型为 void、参数为 p 的函数)。C语言编译器会将这行视为一个局部声明,不会生成任何调用指令。因此执行 Addcontact 时,程序会跳过这行,直接执行后面的 printf,所以 Checkcapacity 函数从未被进入。不加返回类型直接调用Checkcapacity(),并且函数名要写正确。前面不加声明void.
十二、书籍推挤《深入理解计算机系统》,编程平台剑指offer。
链表节点


一、源文件函数大括号后不用写引号;。
二、 1. 创建新节点 struct PersonNode* newNode = (struct PersonNode*)malloc(sizeof(struct PersonNode));且要判断是否创建失败。
三、排序时候,判断两个节点后无论大小前指针往后移动,因此写道判断外面。
四、冒泡排序。前指针每轮循环从头到尾。尾指针固定在最后,由于每轮循环排好最后一个节点,因此每轮后,可以让尾指针往前移动一位。那么该如何移动呢,借助前指针,前指针每轮移动到倒数第二,然后尾指针指向前指针位置即可。
五、冒泡排序。内层循环条件(pre->next!=ret),外层循环使用一个swapped变量。交换则置为1,否则为0。
六、且do while(){}后加引号;。
七、switch内语句退出用beak;不用return。
八、引发了异常: 读取访问权限冲突。 **ret** 是 nullptr。当循环第二次判断 while (pre != NULL) 时,pre 已经为 NULL,循环结束,但在循环体内最后一行 ret = ret->next; 已经在第一次迭代时执行了,此时 ret 为 NULL,所以 ret->next 触发了非法访问。需要将while内改为while(ret!=NULL);
九、C6054 是一个代码分析警告,表示传递给需要零终止字符串的函数的字符串可能未正确零终止。这可能导致缓冲区溢出或程序崩溃,因此需要确保字符串以 \\0 结尾。
十、fwrite 用于将数据块写入文件:fwrite(&(cur->data), sizeof(Person), 1, fp);
-
ptr:指向要写入数据的内存起始地址(通常是你结构体变量的地址)。
-
size:每个数据单元的大小(字节数)。
-
count:要写入的数据单元个数。
-
stream:文件指针(fopen 的返回值)。
这 4 个函数是 C 标准 I/O 库的“四大金刚”,它们共同构成了文件操作的完整生命周期:
fopen:打开文件(获得操作权限)。
fwrite / fread:读写文件内容(传输数据)。
fclose:关闭文件(释放资源并确保数据落盘)
十一、文件的读写操作 笔记


十二、int file_size = 0;
fread(&file_size, sizeof(int), 1, fp);
for (int i = 0; i < file_size; i++) {
struct PersonNode* newnode = (struct PersonNode*)malloc(sizeof(struct PersonNode));
fopen(&newnode, sieozef(struct PersonNode), 1, fp);
if(newnode==NULL){
printf("加载时内存分配失败\\n");
break;}
if(fread(&newnode->data,sizeof(struct person),1,fp)!=1){
printf("内存分配失败“);
free(newnode);
break; }
newnode->next = p->head;
p->head = newnode;
}
fclose(fp);
printf("文件读取成功\\n");
![第5章,[Win32 章节] :绘制填充区域-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260828173251-6a91c6434b552-220x150.png)


