C语言必背100代码系列文章-第三篇:指针与内存管理

C语言指针与内存管理实战代码解析

C语言必背100代码系列文章目录

第一篇:基础语法与入门必背代码

    核心内容:Hello World、条件判断、循环结构、数组基础、函数定义等。

第二篇:数组与字符串操作

   核心内容:数组排序、字符串处理、多维数组、字符匹配、内存拷贝等。

第三篇:指针与内存管理

核心内容:指针运算、动态内存分配、结构体指针、函数指针、内存泄漏检测等。

第四篇:递归与算法

核心内容:阶乘递归、汉诺塔、分治算法、回溯算法、动态规划基础等。

第五篇:数据结构实现

核心内容:链表、栈、队列、二叉树、哈希表、图的基本操作。

第六篇:文件操作与IO

核心内容:文本文件读写、二进制文件操作、日志管理、CSV/JSON解析等。

第七篇:数学与算法进阶

核心内容:快速幂、素数测试、进制转换、矩阵运算、蒙特卡洛模拟等。

第八篇:系统编程与底层开发

核心内容:进程控制、线程同步、信号处理、套接字编程、系统调用封装等。

第九篇:网络编程进阶

核心内容:TCP/UDP通信、HTTP请求、WebSocket、SSL/TLS加密、网络抓包等。

第十篇:综合项目与工具


第三篇:指针与内存管理

想系统掌握C语言内存管理精髓?这10个实战代码模板助你构建高效稳定的程序!从动态数组扩容到结构体深拷贝实现,从内存池优化到文件映射加速,本文深度解析工业级内存操作范式。每个案例聚焦关键场景:动态二维数组的灵活创建、柔性数组的零拷贝技巧、Valgrind与AddressSanitizer协同调试……更有C11内存对齐指令、TLSF自定义分配器等进阶方案。无论你是正在优化对象创建效率的开发者,还是想夯实指针与内存控制基底的学习者,这篇覆盖动态分配、对齐策略、池化技术等核心领域的干货合集,都能让你的C语言代码质量实现跃迁!

1. 动态内存分配(malloc与free)

c

#include <stdio.h>

#include <stdlib.h>

int main() {

int n;

printf("Enter the number of elements: ");

scanf("%d", &n);

// 动态分配数组

int *arr = (int *)malloc(n * sizeof(int));

if (arr == NULL) {

printf("Memory allocation failed\n");

return 1;

}

// 初始化数组

for (int i = 0; i < n; i++) {

arr[i] = i + 1;

}

// 打印数组

for (int i = 0; i < n; i++) {

printf("%d ", arr[i]); // 输出:1 2 3 ... n

}

// 释放内存

free(arr);

return 0;

}

  • 详细注释
    • malloc:分配未初始化的内存块。
    • 检查NULL:避免内存分配失败导致程序崩溃。
  • 应用场景:运行时确定数组大小、动态数据结构(如链表)。
  • 常见问题
    • 忘记free导致内存泄漏。
    • 访问已释放的内存(悬垂指针)。

2. 内存泄漏检测(Valgrind工具)

c

#include <stdio.h>

#include <stdlib.h>

void leakExample() {

int *p = (int *)malloc(10 * sizeof(int));

// 忘记调用 free(p);

}

int main() {

leakExample();

return 0;

}

  • Valgrind检测命令

bash

gcc -g leak_example.c -o leak_example

valgrind --leak-check=full ./leak_example

  • 输出示例

==12345== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1

  • 详细注释
    • Valgrind检测内存泄漏、越界访问等。
  • 应用场景:调试复杂程序、性能优化。
  • 扩展知识
    • 替代工具:AddressSanitizer(ASan)。
    • 自定义内存池减少碎片。

3. 动态数组扩容(类似realloc)

c

<think>我们正在为"C语言100代码"主题创建10篇独立文章,每篇包含10个代码示例。每个代码示例需要包含: 1.详细注释2.应用场景说明3.运行示例由于这是第一篇,我们先从基础开始。以下是第一篇的10个代码示例,涵盖C语言基础语法和常用操作。 注意:每篇文章代码示例应尽量覆盖不同方面,并且难度逐渐增加。第一篇以基础为主。 ###第一篇:C语言基础语法常用操作####1. HelloWorld程序```c#include <stdio.h>//包含标准输入输出头文件intmain(){//主函数,程序入口printf("Hello,World!\n");//打印字符串到控制台return0;//返回0,表示程序正常结束} ```**应用场景**:学习任何编程语言的第一个程序,用于验证开发环境配置是否正确。**运行示例**: ```Hello,World!``` ####2.两个整数相加```c#include <stdio.h> intmain(){int a, b, sum;//定义三个整型变量printf("请输入两个整数:");scanf("%d %d",&a, &b);//从用户输入读取两个整数sum =a +b;//计算和printf("它们的和是:%d\n",sum);//输出结果return0; }``` **应用场景**:基本的用户输入和算术运算,用于理解变量和输入输出操作。 **运行示例**:``` 请输入两个整数:53它们的和是:8```####3.判断奇偶数```c#include <stdio.h> intmain(){int num;printf("请输入一个整数:");scanf("%d",&num);//使用模运算判断奇偶if(num%2 ==0){printf("%d是偶数。\n",num);}else {printf("%d是奇数。\n", num);}return0;} ```**应用场景**:条件语句和模运算的基本应用,常用于简单逻辑判断。**运行示例**: ```请输入一个整数:77是奇数。 ```####4.计算阶乘```c#include<stdio.h>int main() {intn,i;unsignedlong longfactorial=1;//使用无符号长整型以防结果过大printf("请输入一个正整数:");scanf("%d", &n);//阶乘计算for (i =1; i<= n; ++i){factorial *=i;//累乘}printf("%d的阶乘= %llu\n",n,factorial);return0; }``` **应用场景**:循环结构的基本应用,用于计算阶乘等数学问题。 **运行示例**:``` 请输入一个正整数:55的阶乘=120``` ####5.检查素数```c#include <stdio.h> #include<math.h>//引入数学库以使用sqrt函数int main() {intn,i,flag =1;// flag为1表示素数,0表示非素数printf("请输入一个正整数:");scanf("%d", &n);//素数判断:从2到sqrt(n)进行整除测试for (i =2; i<= sqrt(n);i++){if (n %i ==0) {flag=0;//如果被整除,则不是素数break;}}if(n<=1)flag =0; //1和负数不是素数if (flag){printf("%d是素数。\n", n);} else{printf("%d不是素数。\n",n);}return0; }``` **应用场景**:循环和条件语句结合,用于判断一个数是否为素数,是算法基础。**运行示例**: ```请输入一个正整数:2929是素数。 ```####6.斐波那契数列```c#include <stdio.h> intmain(){int i, n;longlong t1 =0, t2 =1, nextTerm;//初始化前两项printf("请输入项数:");scanf("%d",&n);printf("斐波那契数列:");for (i =1; i<= n; ++i){printf("%lld ",t1);//输出当前项nextTerm= t1 +t2;//计算下一项t1 =t2;//更新第一项t2 =nextTerm;//更新第二项}return0; }``` **应用场景**:循环和递推关系的基本应用,生成斐波那契数列。**运行示例**: ```请输入项数:7斐波那契数列:0112358``` ####7.交换两个变量的值```c#include <stdio.h> intmain(){int a, b, temp;printf("请输入两个整数:");scanf("%d %d",&a, &b);//交换变量temp= a;a =b;b= temp;printf("交换后:a= %d,b =%d\n",a,b);return0; }``` **应用场景**:变量交换是许多算法中的基本操作,如排序算法。**运行示例**: ```请输入两个整数:1020交换后:a=20,b =10```####8.求两个整数的最大公约数(GCD) ```c#include <stdio.h> intmain(){int n1,n2,gcd;printf("请输入两个正整数:");scanf("%d%d", &n1, &n2);//使用辗转相除法(欧几里得算法)while (n1!= n2){if (n1> n2){n1-= n2;}else {n2 -=n1;}}gcd =n1; //当n1等于n2时,即为最大公约数printf("最大公约数:%d\n",gcd);return0; }``` **应用场景**:数学问题中常见,用于简化分数等。 **运行示例**:``` 请输入两个正整数:81153最大公约数:9```####9.数组求和```c#include<stdio.h>int main() {intarray[10]= {1,2,3,4,5,6,7,8,9,10}; //初始化数组intsum =0, i;//遍历数组求和for(i=0;i <10; i++) {sum+= array[i];}printf("数组元素之和:%d\n", sum);return0;} ```**应用场景**:数组基本操作,用于数据统计。 **运行示例**:``` 数组元素之和:55```####10.冒泡排序```c#include <stdio.h> intmain(){int array[]= {64,34,25,12,22,11,90};//待排序数组intn =sizeof(array) /sizeof(array[0]);//计算数组长度int i, j, temp;//冒泡排序算法for (i =0;i <n-1;i++){for (j =0;j <n-i-1; j++) {if(array[j]> array[j+1]){//交换相邻元素temp= array[j];array[j]= array[j+1];array[j+1]= temp;}}}//输出排序后的数组printf("排序后的数组:");for (i =0;i <n;i++){printf("%d ",array[i]);}return0;} ```**应用场景**:排序算法基础,用于小规模数据排序。 **运行示例**:``` 排序后的数组:11122225346490```以上是第一篇文章的10个代码示例。接下来我们将创建第二篇,主题可以是指针和数组的深入应用。</think>### C语言代码:基础篇(10个核心示例) #### 1. Hello World程序 ```c #include <stdio.h> // 包含标准输入输出头文件 int main() { // 程序入口函数 printf("Hello, World!\n"); // 输出文本到控制台 return 0; // 程序正常退出 } ``` **应用场景**:编程语言学习入门,验证开发环境配置 **运行结果**: ``` Hello, World! ``` #### 2. 整数四则运算 ```c #include <stdio.h> int main() { int a = 15, b = 4; // 声明并初始化变量 printf("加法: %d\n", a + b); // 加法运算 printf("减法: %d\n", a - b); // 减法运算 printf("乘法: %d\n", a * b); // 乘法运算 printf("除法: %d\n", a / b); // 整数除法 printf("取模: %d\n", a % b); // 取余运算 return 0; } ``` **应用场景**:基础算术运算,计算器程序核心 **运行结果**: ``` 加法: 19 减法: 11 乘法: 60 除法: 3 取模: 3 ``` #### 3. 条件判断(成绩分级) ```c #include <stdio.h> int main() { int score = 85; if(score >= 90) { printf("A\n"); } else if(score >= 80) { printf("B\n"); // 执行此分支 } else if(score >= 70) { printf("C\n"); } else { printf("D\n"); } return 0; } ``` **应用场景**:成绩评估系统,条件分支处理 **运行结果**: ``` B ``` #### 4. 循环求和(1-100) ```c #include <stdio.h> int main() { int sum = 0; for(int i = 1; i <= 100; i++) { // for循环结构 sum += i; // 累加求和 } printf("1-100的和: %d\n", sum); return 0; } ``` **应用场景**:数据统计,批量计算 **运行结果**: ``` 1-100的和: 5050 ``` #### 5. 数组遍历 ```c #include <stdio.h> int main() { int nums[5] = {10, 20, 30, 40, 50}; // 声明并初始化数组 for(int i = 0; i < 5; i++) { printf("元素%d: %d\n", i, nums[i]); // 访问数组元素 } return 0; } ``` **应用场景**:数据处理,传感器读数存储 **运行结果**: ``` 元素0: 10 元素1: 20 元素2: 30 元素3: 40 元素4: 50 ``` #### 6. 函数定义调用 ```c #include <stdio.h> // 函数声明 int max(int a, int b); int main() { int x = 25, y = 37; printf("较大值: %d\n", max(x, y)); // 函数调用 return 0; } // 函数定义 int max(int a, int b) { return (a > b) ? a : b; // 三元运算符 } ``` **应用场景**:模块化编程,代码复用 **运行结果**: ``` 较大值: 37 ``` #### 7. 指针基础 ```c #include <stdio.h> int main() { int var = 50; int *ptr = &var; // 指针指向变量地址 printf("变量值: %d\n", var); printf("指针: %p\n", (void*)ptr); // 打印地址 printf("通过指针访问: %d\n", *ptr); // 解引用 *ptr = 100; // 通过指针修改变量 printf("修改后值: %d\n", var); return 0; } ``` **应用场景**:内存操作,高效数据传递 **运行结果**: ``` 变量值: 50 指针: 0x7ffd4a3b5a9c (示例地址) 通过指针访问: 50 修改后值: 100 ``` #### 8. 结构体使用 ```c #include <stdio.h> #include <string.h> // 定义结构体类型 struct Student { char name[50]; int age; float gpa; }; int main() { // 声明结构体变量 struct Student stu1; // 结构体成员赋值 strcpy(stu1.name, "张三"); stu1.age = 20; stu1.gpa = 3.75f; printf("姓名: %s\n年龄: %d\nGPA: %.2f\n", stu1.name, stu1.age, stu1.gpa); return 0; } ``` **应用场景**:数据记录管理,复杂数据结构 **运行结果**: ``` 姓名: 张三 年龄: 20 GPA: 3.75 ``` #### 9. 文件读写 ```c #include <stdio.h> int main() { FILE *f = fopen("data.txt", "w"); // 打开文件(写模式) if(f == NULL) { // 文件打开检查 printf("文件打开失败\n"); return 1; } fprintf(f, "C语言文件操作示例\n"); // 写入文件 fclose(f); // 关闭文件 // 读取文件 f = fopen("data.txt", "r"); char buffer[100]; fgets(buffer, 100, f); // 读取一行 printf("文件内容: %s", buffer); fclose(f); return 0; } ``` **应用场景**:数据持久化,日志记录 **运行结果**: ``` 文件内容: C语言文件操作示例 ``` #### 10. 动态内存分配 ```c #include <stdio.h> #include <stdlib.h> // 包含malloc/free函数 int main() { int *arr; int size = 5; // 动态分配内存 arr = (int*)malloc(size * sizeof(int)); if(arr == NULL) { // 内存分配检查 printf("内存分配失败\n"); return 1; } // 初始化数组 for(int i = 0; i < size; i++) { arr[i] = i * 10; } // 打印数组 for(int i = 0; i < size; i++) { printf("%d ", arr[i]); } free(arr); // 释放内存 return 0; } ``` **应用场景**:灵活内存管理,大数据处理 **运行结果**: ``` 0 10 20 30 40 ``` ### 相关问题 1. 如何理解C语言中的指针和内存地址关系? 2. 结构体和数组在存储数据时有哪些本质区别? 3. 动态内存分配时为什么须检查返回值? 4. 文件操作中不同模式(r/w/a)有何具体区别? 5. 在循环结构中使用`break`和`continue`有什么注意事项?[^1] [^1]: 静态变量和全局变量在C语言中的初始化发生在编译期,早于任何代码执行。这C++的首次使用初始化机制不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山峰哥

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值