当前位置: 首页 > news >正文

C语言内存管理与命令行参数详解

内存管理

概述

C语言提供了强大的动态内存管理功能,这些函数定义在<stdlib.h>头文件中。与固定大小的数组不同,动态内存分配允许程序在运行时根据实际需求申请和释放内存。

内存管理函数

函数说明
void *calloc(int num, int size);分配一个包含num个元素的数组,每个元素大小为size字节,并将内存初始化为0
void free(void *address);释放由address指向的内存块
void *malloc(int num);分配num字节的内存空间,内容未初始化
void *realloc(void *address, int newsize);重新调整已分配内存块的大小为newsize字节

动态分配内存实例

使用malloc的示例:

c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char name[100];char *description;strcpy(name, "Zara Ali");/* 动态分配内存 */description = malloc(200 * sizeof(char));if(description == NULL) {fprintf(stderr, "错误 - 无法分配所需内存\n");} else {strcpy(description, "Zara ali a DPS student in class 10th");}printf("姓名 = %s\n", name);printf("描述: %s\n", description);
}

使用calloc的替代写法:

c

description = calloc(200, sizeof(char));

使用callocmalloc的主要区别在于,calloc会将分配的内存初始化为零,而malloc不会初始化内存内容。

内存调整与释放

realloc和free的使用示例:

c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char name[100];char *description;strcpy(name, "Zara Ali");/* 初始分配内存 */description = malloc(30 * sizeof(char));if(description == NULL) {fprintf(stderr, "错误 - 无法分配所需内存\n");} else {strcpy(description, "Zara ali a DPS student.");}/* 扩展内存以适应更大描述 */description = realloc(description, 100 * sizeof(char));if(description == NULL) {fprintf(stderr, "错误 - 无法分配所需内存\n");} else {strcat(description, "She is in class 10th");}printf("姓名 = %s\n", name);printf("描述: %s\n", description);/* 使用free()函数释放内存 */free(description);
}

执行结果:

text

姓名 = Zara Ali
描述: Zara ali a DPS student.She is in class 10th

重要注意事项:

  • 程序退出时操作系统会自动回收内存,但良好编程习惯要求显式调用free()释放不再需要的内存

  • 使用realloc()可以灵活调整已分配内存的大小

  • 如果realloc()无法满足内存请求,将返回NULL,因此必须检查返回值

  • 忘记释放内存会导致内存泄漏,而重复释放同一内存块则会造成程序崩溃

命令行参数

概述

命令行参数允许在程序执行时从外部传递参数,这为程序提供了更大的灵活性,避免了在代码中硬编码数值。

参数处理机制

命令行参数通过main()函数的参数处理:

  • argc:整数,表示传递给程序的参数个数

  • argv[]:字符指针数组,指向每个参数字符串

基础示例

c

#include <stdio.h>int main(int argc, char *argv[]) {if(argc == 2) {printf("提供的参数是: %s\n", argv[1]);}else if(argc > 2) {printf("参数过多。\n");}else {printf("期望一个参数。\n");}
}

不同情况下的执行结果:

单个参数:

text

$./a.out testing
提供的参数是: testing

多个参数:

text

$./a.out testing1 testing2
参数过多。

无参数:

text

$./a.out
期望一个参数。

进阶示例(包含程序名和带空格的参数)

c

#include <stdio.h>int main(int argc, char *argv[]) {printf("程序名: %s\n", argv[0]);if(argc == 2) {printf("提供的参数是: %s\n", argv[1]);}else if(argc > 2) {printf("参数过多。\n");}else {printf("期望一个参数。\n");}
}

处理带空格的参数:

text

$./a.out "testing1 testing2"
程序名: ./a.out
提供的参数是: testing1 testing2

关键点说明

  • argv[0]总是存储程序自身的名称

  • argv[1]指向第一个命令行参数,argv[n]指向第n个参数

  • 如果未提供任何参数,argc的值为1(仅包含程序名)

  • 包含空格的参数需要用双引号""或单引号''括起来

通过熟练掌握内存管理和命令行参数处理,C语言程序员能够编写出更加灵活、高效的应用程序。

http://www.dtcms.com/a/442207.html

相关文章:

  • C4D R20新增功能之域的本质及域界面讲解
  • Windows取证
  • 市级数字政府大数据资源平台建设和实施方案PPT(61页)
  • 稀疏检索模型(Sparse Retrieval model)
  • [linux仓库]肝爆进程通信:匿名管道、命名管道、进程池核心原理与实战【万字长文】
  • 【论文阅读】-《Sparse Adversarial Attack via Perturbation Factorization》
  • flash类网站开发定制网络教研系统
  • Fine-Grained Auditing 在 ABP vNext 的落地
  • 新手用PPT百科找模板:简单好用的实操分享!
  • Next.js客户端组件与服务端组件:为什么app路由(App Route)成为新标准?use client、服务端组件嵌套客户端组件
  • 做ppt医学专业图片网站门户网站建设自查整改
  • Product Hunt 每日热榜 | 2025-10-03
  • 监管视角下的大数据信用报告:合规、透明与安全的博弈
  • 7. Pandas 字符串与类别数据处理
  • 【iOS】简单的四则运算
  • Tomcat的CATALINA_BASE
  • 嵌入式 Tomcat 与 Spring MVC 集成
  • MyBatis 进阶
  • 软件设计师-软件工程-软件过程模型
  • 论坛网站方案手机网站建设的趋势
  • LeetCode每日一题——单调数列
  • LeetCode 100题(10题)
  • 后端开发网站做一些什么建设部网站官网 造价鉴定
  • day52-Zabbix(第一部分)
  • 依托Java和百度地图实现长沙市热门道路与景点实时路况检索的实践探索
  • 7-1-查询练习
  • Numpy 手搓线性回归
  • 昆明网站服务器湖北seo推广
  • 医院网站建设怎么样盐城网站建设效果
  • dockerfile理解