C语言模糊不清的知识

news2025/5/13 16:55:29

1、malloc、calloc、realloc的区别和用法

  • malloc实在堆上申请一段连续指定大小的内存区域,并以void*进行返回,不会初始化内存。
  • calloc与malloc作用一致,只是calloc会初始化内存,自动将内存清零。
  • realloc用于重新分配之前通过malloc、calloc或realloc分配的内存块。它允许改变已分配内存块的大小,并根据需要调整内存块的位置。

2、malloc和new的区别?new的实现?malloc的底层实现

 malloc是C库中开辟内存的函数

new为C++关键字,是封装之后的,与类和对象结合更紧密。new是由operator new封装而来,operator new获取原始内存与malloc类似。

malloc底层实现:是调用系统的接口,小内存块利用堆扩展高效管理,大内存用mmap,减少碎片。

3、整型不同类型间互相赋值和提升问题

整型提升:当较小的整型类型(char、short)参与表达式运算时,会被自动提升为int或unsigned int

赋值类型转换:较大类型赋值给较小类型会发生截断

int a = 0x12345678;
short b = a; // b = 0x5678
char c = a; //c = 0x78

较小类型赋值给较大类型会发生扩展

char a = -10; //0xF6
int b = a;    //b = 0xFFFFFFF6

4、&数组名和数组名分别代表什么意义

数组名是以单个元素为单位,&数组名是以整个数组为单位,他们的数组首地址相同

  • 数组名可以看作是指向数组首地址的指针。
  • &数组名指的是产生指向整个数组的指针。

5、当strlen遇上转义字符

int main()
{
	char s[] = "\\123456\123456\t";
	printf("%d\n", strlen(s));
	return 0;
}

\\为一个转义字符算1个字节,123456算6个字节,\123是一个八进制的转移字符算1一个字节,剩下的456\t算4个字节,总共是12个字节。

6、strstr函数和strcat函数

strstr() 是 C 标准库中的一个字符串处理函数,用于在一个字符串中查找子字符串的第一次出现位置。

strstr函数实例如下

手撕如下:

char* mystrstr(const char* p1,const char* p2)
{
    char* cp = p1;
    char* s1 = p1;
    char* s2 = p2;
    while(*cp)
    {
        s1 = cp;
        s2 = p2;
        while(s1 && s2 && *s1 == *s2)
            {
                s1++,s2++;
            }
        if(*s2 == '\0')
            return cp;
        cp++;
    }
    return NULL;
}

 strcat函数

C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

7、枚举的优缺点

优点:

  1. 易读性
  2. 类型安全
  3. 可拓展性

缺点:

  1. 灵活性低
  2. 占用内存
  3. 兼容性差

8、文本文件和二进制文件

  • 数据以二进制存储,不加转化输出为二进制文件。
  • 字符数值型数据以ASCII存储的文件是文本文件。

9、编译的具体细节

1、预处理

展开头文件,替换宏定义,取消注释,预处理之和的代码文件以.i文件结尾

2、编译

根据语法分析语义分析形成汇编语言,文件以.s文件结尾

3、汇编

根据汇编语言汇编指令识别代码形成目标文件,文件以.o文件结尾

4、链接

将多个目标文件和库文件合并形成可执行文件,链接分为动态链接和静态链接,静态链接是直接将库文件代码下载到可执行文件里,动态链接根据运行逐步加载。

最后形成.exe文件或库文件.so .dll

10、volatile、extern、static、typedef的作用

volatile一般用来修饰变量,是为了告诉编译器禁止对变量进行不必要的优化

例如在一个这样的代码里

// 假设 addr 是硬件寄存器地址
int* addr = (int*)0x1234; 
int a = *addr; // 第一次读取寄存器
int b = *addr; // 编译器可能优化为 b = a(假设寄存器值未变)

加入volatile之和

volatile int* addr = (volatile int*)0x1234; 
int a = *addr; // 强制从内存(寄存器)读取
int b = *addr; // 再次强制读取,确保值真实

 在多线程中变量可能呗缓存到CPU寄存器或高速缓存中,导致线程间数据不一致。

加入volatile确保对变量操作直接操作主内存而非缓存。但不保证原子性。

extren用来声明外部变量或函数,告诉编译器声明外部变量或函数

1、跨文件共享变量

2、声明外部函数

与static的区别是extern可以跨文件访问

static用于修饰变量或函数,改变其作用域和生命周期。

static修饰的全局变量的链接属性为内部链接,仅限当前文件可见,禁止跨文件访问。

typedef用于创建类型别名的关键字,仅定义类型别名,不分配内存。这是编译器的行为,有类型的检查,作用域受限。

define是预处理替换,无类型概念,全局有效。

11、柔性数组

柔性数组即数组大小待定的数组,在 C 语言中可以在结构体的最后一个元素使用长度为 0 的数组来实现。

在 C 语言中,柔性数组是一种特殊的数组定义方式。它通常作为结构体的最后一个成员出现,其形式为一个未指定长度的数组类型

在使用柔性数组时,需要我们手动开辟内存空间,并且对内存进行调整,我们用mallohenc进行内存的开辟,使用realloc对内存进行调整扩充。

​
struct S
{
	int n;
	int arr[];//未知大小的数组 - 柔性数组成员
};
int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 10*sizeof(int));
	if (ps == NULL)
	{
		perror("malloc");
		return 1;
	}
	int i = 0;
	ps->n = 10;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	free(ps);
	ps = NULL;
	return 0;
}

​

12、文件操作fsee、ftell、rewind、feof函数

1.fseek

int fseek(FILE* stream,long int offset,int origin);
//第一个参数文件流
//第二个参数偏移量
//偏移量如果是正数,向后偏移
//偏移量如果是负数,向前偏移
//第三个参数起始位置

fseek从当前光标指向的流中获取字符
SEEK_SET:文件的起始位置
SEEK_CUR:文件指针当前位置
SEEK_END:文件的结束位置
在这里插入图片描述

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读
	char ch = fgetc(pf);
	printf("%c\n", ch);//a

	fseek(pf, 4, SEEK_SET);
	//距文件起始位置4个偏移量
	printf("%c\n", fgetc(pf));//e
	
	//fseek(pf,5,SEEK_CUR);
	//距当前文件位置5个偏移量
	//printf("%c\n", fgetc(pf));//g
	
	//fseek(pf,-6,SEEK_END);
	//距文件末尾位置6个偏移量
    //printf("%c\n",fgetc(pf));//d
     
	fclose(pf);
	pf = NULL;

	return 0;
}

这是test.txt中的字符串
在这里插入图片描述 

 2.ftell

返回文件指针相对于起始位置的偏移量

long int ftell(FILE* stream);
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读
	char ch = fgetc(pf);
	printf("%c\n", ch);//a

	int ret = ftell(pf);
	printf("%d\n", ret);//1

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

3.rewind

让文件指针的位置回到文件的起始位置

void rewind(FILE* stream);

 

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读
	char ch = fgetc(pf);
	printf("%c\n", ch);//a

	int ret = ftell(pf);
	printf("%d\n", ret);//1

	rewind(pf);
	//文件指针回到起始位置
	printf("%c\n",fgetc(pf));//a
	//打印a说明文件回到了起始位置

	fclose(pf);
	pf = NULL;

	return 0;
}

 

在这里插入图片描述

二.文件读写结束的判定

文件现在读取结束了,但是是什么原因读取结束的呢?
1.可能是遇到了文件末尾
2.可能是读取的时候发生了错误

1.feof函数(不是用来判定文件结束的)

文件已经结束,用来判定文件结束的原因
feof的作用是:文件读取结束的时候,判断文件是否遇到文件末而结束的
feof没有读到文件末尾返回0,读到文件末尾返回非0值

int feof(FILE* stream)
//feof函数只需要关注传入的文件指针是否为NULL即可

2.ferror函数

文件已经结束,ferror读取的时候没有发生错误返回0,发生错误返回非0值

int ferror(FILE* stream)
//ferror函数只需要关注传入的文件指针是否为NULL即可

下面来举一个例子:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	//打开文件
	if (pf == NULL)
	{
		perror("fopen");
		//打印错误
		return 1;
		//发生错误提前返回
	}
	//使用
	char ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}
	printf("\n");
	if (feof(pf))//返回非0值
	{
		printf("读到文件末尾而结束\n");
	}
	else if(ferror(pf))//返回非0值
	{
		printf("读取错误而结束\n");
		perror("ferror");
	}
	fclose(pf);
	//关闭文件
	pf = NULL;

	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何配置光猫+路由器实现外网IP访问内部网络?

文章目录 前言一、网络拓扑理解二、准备工作三、光猫配置3.1 光猫工作模式3.2 光猫端口转发配置&#xff08;路由模式时&#xff09; 四、路由器配置4.1 路由器WAN口配置4.2 端口转发配置4.3 动态DNS配置&#xff08;可选&#xff09; 五、防火墙设置六、测试配置七、安全注意事…

springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化

一句话本质 为每个线程创建独立的变量副本&#xff0c;实现多线程环境下数据的安全隔离&#xff08;线程操作自己的副本&#xff0c;互不影响&#xff09;。 关键解读&#xff1a; 核心机制 • 同一个 ThreadLocal 对象&#xff08;如示意图中的红色区域 tl&#xff09;被多个线…

【高数上册笔记篇02】:数列与函数极限

【参考资料】 同济大学《高等数学》教材樊顺厚老师B站《高等数学精讲》系列课程 &#xff08;注&#xff1a;本笔记为个人数学复习资料&#xff0c;旨在通过系统化整理替代厚重教材&#xff0c;便于随时查阅与巩固知识要点&#xff09; 仅用于个人数学复习&#xff0c;因为课…

c++STL-string的模拟实现

cSTL-string的模拟实现 string的模拟实现string的模拟线性表的实现构造函数析构函数获取长度&#xff08;size&#xff09;和获取容量&#xff08;capacity&#xff09;访问 [] 和c_str迭代器&#xff08;iterator&#xff09;交换swap拷贝构造函数赋值重载&#xff08;&#x…

YashanDB(崖山数据库)V23.4 LTS 正式发布

2024年回顾 2024年11月我们受邀去深圳参与了2024国产数据库创新生态大会。在大会上崖山官方发布了23.3。这个也是和Oracle一样采用的事编年体命名。 那次大会官方希望我们这些在一直从事在一线的KOL帮助产品提一些改进建议。对于这样的想法&#xff0c;我们都是非常乐于合作…

python 写一个工作 简单 番茄钟

1、图 2、需求 番茄钟&#xff08;Pomodoro Technique&#xff09;是一种时间管理方法&#xff0c;由弗朗西斯科西里洛&#xff08;Francesco Cirillo&#xff09;在 20 世纪 80 年代创立。“Pomodoro”在意大利语中意为“番茄”&#xff0c;这个名字来源于西里洛最初使用的一个…

PyCharm 加载不了 conda 虚拟环境,不存在的

#工作记录 前言 在开发过程中&#xff0c;PyCharm 无法加载 Conda 虚拟环境是常见问题。 在不同情况下&#xff0c;“Conda 可执行文件路径”的指定可能会发生变化&#xff0c;不会一尘不变&#xff0c;需要灵活处置。 以下是一系列解决此问题的经验参考。 检查 Conda 安装…

设计模式学习整理

目录 UML类图 设计模式六大原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则(最少知道原则) 6.开(放封)闭原则 设计模式分类 1.创建型模式 2.结构型模式 4.行为型模式 一、工厂模式(factory——简单工厂模式和抽象工厂模式) 1.1、…

二分查找的理解

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int binary_search(int arr[], int k, int sz) {int left 0;int right sz - 1;//这个是下标&#xff0c;减一是因为在0开始的&#xff0c;怕越界&#xff08;访问无效&#xff09;while (left < right){int mid…

【Java】线程实例化 线程状态 线程属性

线程实例化 继承 Thread 类 创建类继承自 Thread 类 . class MyThread extends Thread重写 run() 方法 . Overridepublic void run(){// 线程要执行的任务代码}实例化自定义线程类 . 实现 Runnable 接口 创建类实现 Runnable 接口 . class MyRunnable implements Runnable实…

卫宁健康WiNGPT3.0与WiNEX Copilot 2.2:医疗AI创新的双轮驱动分析

引言:医疗AI的双翼时代 在医疗信息化的浪潮中,人工智能技术的深度融入正在重塑整个医疗行业。卫宁健康作为国内医疗健康和卫生领域数字化解决方案的领军企业,持续探索AI技术在医疗场景中的创新应用。2025年5月10日,在第29届中国医院信息网络大会(CHIMA2025)上,卫宁健康…

I2C通讯

3.1. 本章节的代码仓库 1 2 3 4 5 6 #如之前有获取则可跳过 #获取仓库 git clone https://gitee.com/LubanCat/lubancat_rk_code_storage.git#代码所在的位置 lubancat_rk_code_storage/quick_start/i2c3.2. i2c I2C(Inter&#xff0d;Integrated Circuit)是一种通用的总线协…

Excel实现单元格内容拼接

一、应用场景&#xff1a; 场景A&#xff1a;将多个单元格拼接&#xff0c;比如写测试用例时&#xff0c;将多个模块拼接&#xff0c;中间用“-”隔开 场景B&#xff1a;将某单元格内容插入另一单元格固定位置&#xff08;例如在B1中添加A1的内容&#xff09; 二、实际应用&a…

2025前端面试遇到的问题(vue+uniapp+js+css)

Vue相关面试题 vue2和vue3的区别 一、核心架构差异 特性Vue2Vue3响应式系统基于Object.defineProperty基于Proxy&#xff08;支持动态新增/删除属性&#xff09;代码组织方式Options API&#xff08;data/methods分块&#xff09;Composition API&#xff08;逻辑按功能聚合&am…

广东省省考备考(第八天5.11)—言语:逻辑填空(每日一练)

错题 解析 第一空&#xff0c;搭配“期盼”&#xff0c;且根据“生命&#xff0c;是来自上天的馈赠”&#xff0c;可知父母对孩子的出生是非常期盼的。A项“望穿秋水”&#xff0c;形容对远地亲友的殷切盼望&#xff0c;C项“望眼欲穿”&#xff0c;形容盼望殷切&#xff0c;均…

github+ Picgo+typora

github Picgotypora 本文将介绍如何使用Picgo在typora中实现上传服务 创建github仓库以及配置token 创建仓库 注意需要Initialize 添加README 配置为public 配置token github点击头像找到setting 选择Developer setting 配置token generate 选第一个第二个都行(我这里选第…

[网安工具] IP 信息收集工具 —— LBD · 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网络安全工具管理 —— 工具仓库 管理手册 lbd | Kali Linux ToolsVideolbd Usage ExampleTest to see if the target domain (example.com) is using a load balancer:rootkali:~# lbd example.c…

说说es配置项的动态静态之分和集群配置更新API

这天因为某件工作来到了es官网某个参数配置相关的页面&#xff0c;注意到了下图圆圈里的“Dynamic”&#xff1a; 链接&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cluster.html#misc-cluster-settings 显然这是对配置项的一个描述&am…

LLMs之Mistral Medium 3:Mistral Medium 3的简介、安装和使用方法、案例应用之详细攻略

LLMs之Mistral Medium 3&#xff1a;Mistral Medium 3的简介、安装和使用方法、案例应用之详细攻略 目录 Mistral Medium 3 简介 1、Mistral Medium 3 特点 Mistral Medium 3 安装和使用方法 2、使用方法 (1)、创建Agent (2)、模型微调 Mistral Medium 3 案例应用 Mistr…

并发设计模式实战系列(17):信号量(Semaphore)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第十七章信号量&#xff08;Semaphore&#xff09;&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 信号量本质模型 2. 并发控制…