
C语言
C语言的一些笔记 刷题
liujjjiyun
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Web 服务器的 C 语言实现
Web 服务器对应的文件是 MyHttp.c,代码示例如下, 其中使用到的页面文件(.html)需要用户自己提供,并且和程序在同一个位置。原创 2025-02-11 12:42:08 · 224 阅读 · 0 评论 -
如何返回两个甚至多个值?
【代码】如何返回两个甚至多个值?原创 2025-02-06 12:53:21 · 149 阅读 · 0 评论 -
交换函数Swap
关于野指针:也称为悬挂指针,你没有访问权限的地址(指针),这个指针有可能不存在也有可能存在但是你不能访问。3.地址之前可以访问,但现在不可以(更换电话号码,我却给你之前的号码打电话)2.地址存在但是不能访问(电话号写成别人)野指针很麻烦,不好判断(错误的电话号码)1.地址不存在(电话号少一位)原创 2025-02-06 12:50:51 · 232 阅读 · 0 评论 -
VS2019代码编译链接常见错误及解决方案
如果我们在编译,链接时产生了错误,我们要先看下面的错误提示信息 我们看错误信息的时候都是从上到下看的。 它会先提示你是哪个源文件出现问题了,然后(9,1)的第一个数字代表行号,第二个数字的当前行的第几格,然后后面还有“语法错误”的提示信息我们再看1个例子: 这些都是属于编译阶段的错误。我们再来看: 这时候是warning,不是error,只是给了个警告,警告是不影响我们编译链接成功的,警告只是说这里面有风险,但是不是错误。 但是对原创 2025-02-04 12:59:09 · 305 阅读 · 0 评论 -
C/C++中的__asm关键字
_asm 关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。_asm是 __ASM 的同义词。ASM是C++中的一个关键字,用于在C++源码中内嵌汇编语言。ASM能写在任何C++合法语句中,asm还不是C的标准关键字,C11标准未加入正文,仅在Annex J中标记为“公共扩展”。但是大多数C实现都将其视为一个关键字。原创 2025-02-02 15:53:35 · 363 阅读 · 0 评论 -
动态内存管理与结构体
结构体变量和内置类型都有局部,全局,动态生存期。结构体也可以嵌套指向自身的指针。原创 2025-01-30 13:45:19 · 178 阅读 · 0 评论 -
栈区和堆区的区别
当系统收到程序的内存分配申请时,会遍历该链表寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并把该结点空间分配给程序。可见,堆容易造成内存碎片;所以栈在程序中应用最广泛,函数调用也是利用栈来完成,调用过程中的参数,返回地址,栈基指针和局部变量等都采用栈的方式存放。:栈在函数调用时,首先压入是函数实参,然后主调函数中下条命令(函数调用语句的下条执行语句)的地址压入,最后是被调函数的局部变量。:栈不会存在碎片问题,因为栈是先进后出的队列,内存块弹出栈之前,在其上面的后进的栈内容已弹出。原创 2025-01-30 13:41:53 · 259 阅读 · 0 评论 -
动态内存
我们知道栈区在函数被调分配时,用于存放函数的参数值,局部变量等值,在Windows中栈的默认大小是1M,在VS中可以设置栈区的大小;在Linux中栈的默认大小是10M,在gcc编译时可以设置栈区的大小。:程序运行时可以在堆区动态地申请一定大小的内存,并在用完之后归还给堆区。在Linux系统中堆区的大小接近3G。一般情况下,我们需要大块内存或程序在运行的过程中才知道所需内存大小,我们就从堆区分配空间。原创 2025-01-30 13:22:28 · 747 阅读 · 0 评论 -
二分查询算法
我们把第一个数组的最后一个元素取出来,把第二个数组的第一个元素取出来,进行比较,然后把第二个数组的最后一个元素和第一个数组的第一个元素取出来对比。如果大于,就是第n个。然后我们在第二个数组折半找到中间的值,距离第二个数组首元素多远。然后看这个中间值在第一个数组哪里,距离第一个首元素多远。如果查找的数据有相同的,找你最左边的数据或者最右边的数据。如果找着,tag=1,如果为0,没有找着,在pos位置进行插入。我们要找50,但是找不着。如果找着返回下标,如果没有找着就插入。这2个数组合并成1个就是大小为2n。原创 2025-01-21 17:23:57 · 177 阅读 · 0 评论 -
分治策略
看下面这个代码,能不能一直递归下去?是不能的!没有“死递归”,因为我们在递归的过程中不断地申请空间,栈帧的大小在Windows下是1M,在Linux是10M,总有时候会把内存耗尽!还有一个问题 ,我们在计算阶乘的时候,很容易就突破整型的范围,该怎么办呢?怎么解决???先计算出int类型最大承受的阶乘数我们看到 int类型可以承受的最大阶乘数是15因为显示16的阶乘变小了。原创 2025-01-21 17:15:17 · 767 阅读 · 0 评论 -
new/delete 和 malloc/free 区别
在 C++中堆内存的分配和释放是通过 new 和 delete 来操作的。使用方式如下开辟内存: 类型* 指针变量名 = new 类型(初始化数值);释放内存: delete 指针变量名;1.malloc开辟空间是函数,需要引用<stdlib.h>头文件new是关键字2.malloc开辟空间返回无类型指针,需要强转new 是int类型的空间3.malloc 要计算类型的大小new int类型的大小是自动进行计算的4.malloc只是开辟空间。原创 2025-01-14 12:33:40 · 403 阅读 · 0 评论 -
C/C++ 输入输出的区别
cin是一个istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。cout是一个ostream类的对象,它有一个成员运算函数operator<<,每次调用的时候就会向输出设备输出。扩展性更强,iostream使用的<<、>>操作符都是可重载,只要重载相关的运算符就可以;类型处理更安全、智能,printf中对付int、float等说明符比较麻烦。原创 2025-01-13 14:49:52 · 142 阅读 · 0 评论 -
C++ 常见问题总结(11)
好处是:当前代码抛出异常,如果在当前函数栈帧没有找到相应的catch块,就会这个异常抛给调用方函数,调用方函数依然是这样处理的,如果有处理异常的catch代码块,就向下运行,如果没有,就继续抛给调用方,直到到main函数还没有处理再抛给系统,系统发现有异常没有处理,就中止了。如果在函数上有找到catch块,就继续运行。异常的栈展开!异常的好处是可以把代码中所有的异常抛到统一的地方进行处理(比如说抛到main函数中统一处理)!exit(0);原创 2025-01-13 14:11:54 · 249 阅读 · 0 评论 -
C++ 常见问题总结(4)
(从本质上来说,访问越界就是,系统给我们分配了既定大小的内存,我们理应在这个既定大小的内存中访问,但是由于某些原因,我们访问这个内存超过了系统给我们分配的既定内存。1.访问数组元素越界了2.vector容器访问 vector< int > vec;vec[2];这样也访问越界,vector是空容器,什么元素都没有str[2] 空字符串,也是访问越界4.array(C++11提供的内存不可扩容)访问超过范围的下标也是访问越界5.字符串处理,没有添加’\0’字符,导致访问字符串的时候越界了。原创 2025-01-12 18:32:31 · 266 阅读 · 0 评论 -
C++ 常见问题总结(3)
内存泄漏:分配的堆内存(没有名字,只能用指针来指向)没有释放,也再没有机会释放了,也就是指向堆内存的指针指向其他地方去了,找不着原来的内存,也没有机会释放。使用智能指针来防止内存泄漏(智能指针利用栈上对象出作用域自动析构的特点,在智能指针的析构函数就把资源释放了)。原创 2025-01-12 18:29:58 · 238 阅读 · 0 评论 -
C和C++的相互调用
C 调用 C++:无法直接调用了!怎么办?把C++源码扩在extern “C”C++ 调用 C代码:无法直接调用了!怎么办?把C函数的声明扩在extern "C"里面我们写一个.c文件:我们在另一个.cpp文件进行调用这个sum函数: 编译看看: 链接错误,因为编译器按照C++的标准生成符号(函数名+参数列表),在链接的时候发现这里有一个未定义的符号,就在其他的.obj或者.o文件都找,但是找不到。 C 调用 C++:无法直接调用了!怎么办?把C++源码扩在extern "C"在C++文原创 2025-01-11 11:07:28 · 339 阅读 · 0 评论 -
C++ const与二级指针的结合应用
A错误,因为B正确。C正确。const不参与类型。都是int*D正确。A错误。把常量的地址给普通的指针了。B正确。C正确。D错误。E错误。原创 2025-01-10 12:23:06 · 496 阅读 · 0 评论 -
const与一级指针的结合应用
去掉const修饰的类型,就是const修饰的表达式,就是p本身了,p本身是常量,不能被修改,但是 *p没有被const修饰,可以修改。这个const修饰的是int *了,因为 * 自己不能作为类型,所以再往前走,就是int *了。前面的const修饰的类型是int,所以const修饰的表达式是*p,所以 *p不能被赋值。后面的 const修饰的类型是int *,所以修饰的表达式是p,所以p不能被赋值。*p被const修饰了,const修饰了指针p的指向,指向的东西不能被赋值了。Int *q=p是错误的。原创 2025-01-10 11:53:46 · 419 阅读 · 0 评论 -
C++特别提供的四种类型转换方式
如果指向的是其他派生类的对象,那么调用这个func就可以了,但是,如果指向的是Derive2这个对象,就不要调用这个func方法,应该调用derive02func这个方法。p指针是Base类型的指针,Base里面是虚函数,识别的是运行时的动态绑定,就是指针指向的对象,进而访问其虚函数表,取的是RTTI的类型。现在就要识别*p的类型,到底指向的是哪个对象,如果是Derive这个对象, 就要重新调用函数。强转,是语言级别的,不产生任何额外的指令代码,这两句在汇编指令上没有区别。只有4字节,造成了不安全。原创 2025-01-08 12:47:51 · 914 阅读 · 0 评论 -
一个结构体里面定义了一个char和double,它的内存布局?
答案是16C语言的结构体和C++的类都是要内存对齐,方式是一样的第一行:char占1个字节,剩下的7个字节补位的第二行的8个字节就是double就是1我们看看下面这个:都是char,最长的分量是1个字节,按1个字节对齐,总共3空结构体多大?为什么在gcc下,C语言的空结构体大小是0,C++的空结构体大小是1?1、空结构体,不需要访问什么东西,啥也改干了,所以C语言中,定义空结构体的大小是02、而在C++中,struct定义的东西不叫变量,叫做对象。原创 2025-01-02 20:02:23 · 320 阅读 · 0 评论 -
有一个函数
参数是从左向右压的,从实参到形参,我们看到这是既没有用指针传递,也没有用引用传递,所以都是要生成新的string对象,实参s2,s1到形参s2,s1,调用的是拷贝构造函数,1、这里调用2次拷贝构造函数,先构造s2,然后构造s1。然后tmp对象返回,通过C++11的优化,调用右值的拷贝构造函数(移动构造函数),拿tmp直接拷贝构造main函数的s对象。然后出fun的右},析构tmp对象,然后析构s1, 然后析构s2,最后析构s。原创 2025-01-02 19:55:27 · 228 阅读 · 0 评论 -
函数调用参数的传递
栈上取这个局部变量都是通过ebp的偏移来取的,func函数在编译的时候,根本就没有办法访问到这个a了,因为现在是从左向右压的,第一个参数肯定是在栈底,后面的参数在栈顶,紧接着压下一行指令地址和func函数的ebp,func函数在编译阶段,不知道它会有多少个参数,不知道用户传几个参数,根本不知道,它在访问a,不知道把ebp偏移多少,所以是没有办法生成指令去访问它的参数的,因为编译阶段不知道用户会传多少个参数。已知的这个参数就在栈顶了,所以它就永远知道ebp+4就是这个已知的参数的内存!原创 2025-01-02 19:50:40 · 608 阅读 · 0 评论 -
堆和栈的区别
堆内存是:在代码上通过malloc或者new,通过free或者delete还释放堆内存。堆内存是我们用户手动开辟的,手动释放的。栈内存是:调用一个函数,就用到栈的内存,出函数的右括号},栈内存进行回收。栈内存是系统自动开辟,自动释放的。原创 2025-01-02 19:45:20 · 166 阅读 · 0 评论 -
程序的内存布局
再比如说,.data端和.bss段在内存上,属于同一个内存属性:可读可写,也是放到同一个段。从段的角度来说,是肯定不会杂到一块放的,从内存的角度来说,是在一块放的。在进行内存布局的时候,操作系统去管理内存,都是以页面来进行分配的,但是.text段不一定就占1个页面,也有可能它不够用,会占用2个页面。一个系统上可以运行几百个进程,每个进程它的用户空间都是独立的,但是内核空间都是共享的,因为操作系统只有1份!从内存的角度来说,它们都是相同内存属性的段,是放到同一块的。原创 2025-01-02 19:42:51 · 298 阅读 · 0 评论 -
模拟实现C++智能指针shared_ptr和weak_ptr
当弱智能指针weak_ptr的引用计数为0时,析构引用计数对象\。当强智能指针shared_ptr的引用计数为0时,析构资源。原创 2024-12-30 11:07:53 · 329 阅读 · 0 评论 -
为什么是1.5或者2倍方式扩容?
而不是3倍,4倍的方式扩容?扩容的机制:开辟新空间,拷贝元素,释放旧空间。而理想的方案是我在下一次扩容的时候,如果刚好可以利用前n-1次所释放的空间,那就太好了。假如说我们是以2倍方式扩容(1,2,4,8,16),则第i次扩容期间所需要的空间总量就是2^i次方,如果第4次扩容时总共需要8个元素大小的空间,但是前3次已经释放的空间加起来的总量,刚好是7,而7小于8,不足以我们第4次扩容时所需要的空间,也就是说,如果恰巧以2倍方式扩容,那么每次扩容时前面释放的空间它都不足以支持本次的扩容!!!原创 2024-12-28 20:50:30 · 653 阅读 · 0 评论 -
最长不含重复字符的子字符串 剑指offer
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含'a'~'z'的字符。例如,在字符串"arabcacfr"中,最长的不含重复字符的子字符串是"acfr",长度为4。原创 2024-12-19 19:11:59 · 981 阅读 · 0 评论 -
把数字翻译成字符串 剑指offer
给定一个数字,我们按照如下规则把它翻译成字符串:0翻译成“a”,1 翻译成“b”,……,11翻译成“l”,……,25翻译成“z”。一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是“bccfi”“bwfi”、“bczi”、“mcfi”和“mzi”。请编程实现一个的函数,用来计算一个数字有多少种不同的翻译方法。原创 2024-12-19 18:35:14 · 322 阅读 · 0 评论 -
把数组排成最小的数 剑指offer
输入一个正整数数组,把数组里所有数字拼接起来排列成一个数,打印能拼接出的所有数字中最小的一个。例如,输入数组(3,32,321},则打印出这3个数字能排成的最小数字321323。原创 2024-12-19 18:21:48 · 432 阅读 · 0 评论 -
数字序列中某一位的数字 剑指offer
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第 19位是 4,等等。请写一个函数,求任意第n位对应的数字。原创 2024-12-19 18:07:50 · 261 阅读 · 0 评论 -
1~n整数中1出现的次数 剑指offer
输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。原创 2024-12-18 21:17:52 · 290 阅读 · 0 评论 -
连续子数组的最大和 剑指offer
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。原创 2024-12-18 21:05:21 · 199 阅读 · 0 评论 -
数组中出现次数超过一半的数字 剑指offer
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组(1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。原创 2024-12-18 20:06:25 · 436 阅读 · 0 评论 -
字符串的排列 剑指offer
输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab 和cba。原创 2024-12-16 20:58:20 · 415 阅读 · 0 评论 -
顺时针打印矩阵 剑指offer
输入一个矩阵,按照从外往里以顺时针的顺序依次打印出每一个数字。例如,如果输入以下矩阵:可以用一个循环来打印矩阵,每次打印矩阵中的一个圈。原创 2024-12-14 20:06:31 · 185 阅读 · 0 评论 -
小U的商品编号特殊含义统计
小U正在给一批商品进行编号,他希望找出在特定区间内包含特定数字(5、20和520)的商品编号的数量。给定若干个编号区间,你需要分别计算出每个区间内包含数字5,数字20和数字520的编号数量。由于我们需要检查每个编号的字符串表示中是否包含特定的子字符串,因此可以将每个编号转换为字符串进行处理。内,包含特定数字(5、20 和 520)的商品编号的数量。你需要计算在给定的区间。原创 2024-12-12 15:45:58 · 594 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面 剑指offer
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所以偶数位于数组的后半部分。原创 2024-12-10 00:00:00 · 336 阅读 · 0 评论 -
表示数值的字符串 剑指offer
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但是“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。原创 2024-12-09 18:43:43 · 163 阅读 · 0 评论 -
正则表达式匹配 剑指offer
请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。原创 2024-12-09 16:53:06 · 167 阅读 · 0 评论 -
阿里笔试题
转成3进制末尾有几个0?这个题有些难度,可以先思考下面的问题,回头再回答这题.2.假设在n进制下,下面的等式成立,567*456=150216,n的值是()。原创 2024-12-09 15:13:05 · 124 阅读 · 0 评论