![](https://img-blog.csdnimg.cn/20210410095535712.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C
文章平均质量分 58
C
Overboom
这个作者很懒,什么都没留下…
展开
-
C语言 --- 字符串和字符数组
1. 字符串和字符数组的区别:C语言中没有字符串这种数据类型,可以通过char的数组来代替字符串一定是一个char的数组,但char的数组未必是字符串数字0(和字符’\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char数组。2. 数字0,C语言字符串结束标志’\0’,空格的关系来段测试代码看下:#include <iostream>#include <string.h>原创 2021-12-24 13:41:25 · 625 阅读 · 0 评论 -
char *p 与char p[] 比较
所有的字符窜常量都被放在静态内存区因为字符串常量很少需要修改,放在静态内存区会提高效率例:char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 = "abc";cout << (原创 2021-11-15 19:28:29 · 726 阅读 · 0 评论 -
【C语言】 --- getopt()函数的使用简析
1. getopt函数申明int getopt(int argc, char * const argv[],const char *optstring);使用时需包含头文件 unistd.hargc、argv:分别来自命令行传给main()函数的参数argc(参数个数)和argv(参数数组)。optstring:是一个包含合法选项字符的字符串。2. getopt函数的作用getopt被用来解析命令行选项参数。也即对optstring中的选项字符的处理:(1)选项字符后面跟一个冒号“:",则原创 2021-07-23 14:11:22 · 586 阅读 · 0 评论 -
C语言 --- sprintf用法
头文件:#include <stdio.h>sprintf()函数用于将格式化的数据写入字符串,其原型为: int sprintf(char *str, char * format [, argument, ...]);【参数】str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量。除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数–格式化字符串–上。 printf()和sprintf()都使用格式化字原创 2021-07-19 10:47:42 · 3464 阅读 · 0 评论 -
死锁的理解
一、死锁的概念死锁(英语:deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。在多任务操作系统中,操作系统为了协调不同行程,能否获取系统资源时,为了让系统正常运作,必须要解决这个问题。另一种相似的情况称为“活锁”。(wiki)死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永.原创 2021-03-27 12:45:13 · 1754 阅读 · 0 评论 -
【C语言】 --- 段错误
一、段错误的概念存储器区段错误(英语:Segmentation fault,经常被缩写为segfault),又译为存储器段错误,也称访问权限冲突(access violation),是一种程序错误。它会出现在当程序企图访问CPU无法寻址的存储器区段时。当错误发生时,硬件会通知操作系统产生了存储器访问权限冲突的状况。操作系统通常会产生核心转储(core dump)以方便程序员进行调试。通常该错误是由于调用一个地址,而该地址为空(NULL)所造成的,例如链表中调用一个未分配地址的空链表单元的元素。数组访原创 2021-03-26 23:45:59 · 6777 阅读 · 0 评论 -
内存泄露和内存溢出
一、内存泄露的概念内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。(摘抄自百度百科)内存泄露是由于疏忽或者错误造成程序未能释放已经不再使用的内存。内存泄露并非值内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成内存的浪费。(摘抄自wiki)二、内存泄露的后果内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降原创 2021-03-26 23:39:00 · 645 阅读 · 0 评论 -
【C】 --- # 和 ## 作用于宏的理解
一、一般用法“#”用来把宏参数变为一个字符串“##”把两个宏参数贴合在一起#include <stdio.h>#include <iostream>using namespace std;#define STR(s) #s#define CONS(a, b) int(a##e##b)int main(void){ printf("%s\n", STR(abcdefg)); printf("%d\n", CONS(2, 3)); syste转载 2021-03-25 23:41:30 · 140 阅读 · 0 评论 -
for-if-break/do-while-break嵌套的问题
C语言一个小的知识点。for中嵌套if,if中包含break,当执行到break的时候,是跳出if还是跳出for循环?同样的do-while中包含if,if中包含break,当执行到break的时候,是跳出if还是跳出do-while循环先说答案,两种情况下都是跳出循环。上code,测试一下#include <stdio.h>int main(void){ int i = 0; for(i=0; i<5; i++) .原创 2021-02-26 13:24:04 · 3192 阅读 · 0 评论 -
C回调函数
https://www.runoob.com/w3cnote/c-callback-function.html转载 2021-02-23 22:06:27 · 98 阅读 · 0 评论 -
C语言 --- 实现字符串字串查找strstr
#include <stdio.h>char *strStr(const char *str1, const char *str2){ int i = 0; if (*str2) { while (*str1) { for (; *(str1 + i) == *(str2 + i); i++) { if (!*(str2 + i + 1)) ...原创 2020-01-06 19:16:28 · 1073 阅读 · 0 评论 -
C语言 --- 实现字符串反转
方法一:通过开辟与源字符串一样大小的内存实现反转#include <stdio.h>#include <string.h>void test01(){ int count = 0; char src[] = "hello,world"; char *dest = NULL; int len = strlen(src); dest = (char*)...原创 2019-11-10 12:38:42 · 1432 阅读 · 0 评论 -
C语言---函数指针与指针函数
//函数指针 是指向函数的 指针 //指针函数 函数的返回值是一个指针的 函数1、指针函数的例子int * func(void);返回值是指针的函数2、函数指针的定义//函数指针的定义方式void test01(){ //先定义出函数类型,再通过类型定义出函数指针 typedef void(FUNC_TYPE)(); FUNC_TYPE * pFun...原创 2019-11-08 22:29:36 · 152 阅读 · 0 评论 -
C语言 --- 一维数组名的理解
1、两种情况下,一维数组不是指向数组首元素地址的指针 int arr[5] = { 1, 2, 3, 4, 5 }; //除了两种特殊情况下,一维数组名称都是指针首元素的地址 //特殊情况1: 对数组名称 进行sizeof printf("sizeof arr = %d\n", sizeof (arr)); //20 //特殊情况2: 对数组名称 取地址 //int * ...原创 2019-11-06 20:08:01 · 810 阅读 · 1 评论 -
malloc calloc realloc
/*realloc的机制:如果比原来分配的内存要大,有两种情况1、如果原来空间的后面有足够大的空间,那么直接在后面继续开辟内存,返回原来 的地址2、如果原来空间的后面没有足够大的空间,那么系统会直接分配一个新的空间,这个新空间就是需要的内存空间,将原有空间下的数据拷贝到新空间,并且将原有空间释放,返回新空间的首地址*//*calloc与malloc的不同calloc和malloc...原创 2019-11-06 10:10:47 · 203 阅读 · 0 评论 -
C语言反转字符串操作
#include <stdio.h>void reverseString1(char *str){ if (str == NULL) return; int begin = 0; int end = strlen(str) -1; while (begin < end) { char temp = str[begin]; str[begin] = s...原创 2019-11-05 21:26:55 · 763 阅读 · 0 评论 -
C语言中的const,冒牌货常量
const 修饰的全局变量,初始化则存放在data区,未初始化放在bss区 不可以直接修改;用指针的方式间接修改,编译不出错但是运行会出错const修饰的局部变量, 放在栈上 不可以直接修改;用指针的方式间接修改,编译不出错但是运行也不出错 用指针间接修改的方式可以改变const修饰的局部变量#include <...原创 2019-11-05 18:26:35 · 193 阅读 · 0 评论 -
C语言链表基本操作
#include <stdio.h>#include <stdlib.h>typedef struct Node{ int data; //数据域 struct Node *next; //指针域}Node;Node* createList(){ Node* headNode= (Node *)malloc(sizeof(Node...原创 2019-10-17 19:55:47 · 378 阅读 · 0 评论 -
C语言volatile关键字
一、volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化。通常在程序中申明了一个变量时,编译器会尽量把它存放在通用寄存器中,例如ebx。当CPU把其值放到ebx中后就不会再关心对应内存中的值。若此时其他程序(例如内核程序或一个中断)修改了内存中它的值,ebx中的值并不会随之更新。为了解决这种情况就创建了volatile限定...转载 2019-05-30 18:56:50 · 229 阅读 · 0 评论 -
C语言const关键字的用法总结
一、const修饰普通变量1、说 const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:const int a = 10;int const a = 10; 这两种写法都是正确的,但是下面这种写法是错误的int const a;a = 10;...原创 2018-11-16 12:09:32 · 11260 阅读 · 9 评论 -
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
strcpy的实现char *strcpy(char *strDest, const char *strSrc){ assert((strDest!=NULL) && (strSrc !=NULL)); char *address = strDest; while( (*strDest++ = * strSrc++) != '\0' ) ...原创 2019-09-26 21:17:29 · 219 阅读 · 0 评论 -
C实现快速排序
本节介绍一个非常优秀且最常用的排序算法,快速排序算法。这个算法极其重要,初学者一定要掌握。快速排序尤其适用于对大数据的排序,它的高速和高效无愧于“快速”两个字。虽然说它是“最常用”的,可对于初学者而言,用它的人却非常少。因为虽然很快,但它也是逻辑最复杂、最难理解的算法,因为快速排序要用到递归和函数调用。快速排序所采用的思想是分治的思想。所谓分治,就是指以一个数为基准,将序列中的其他数往它两...转载 2019-09-26 18:58:51 · 259 阅读 · 0 评论 -
C语言结构体初始化的四种方法
博客原文:https://blog.csdn.net/ericbar/article/details/79567108定义struct InitMember{ int first; double second; char* third; float four;};方法一:定义时赋值struct InitMember test = {-10,3...转载 2018-07-24 20:08:54 · 8297 阅读 · 0 评论 -
指针数组与数组指针辨析
原文地址:https://blog.csdn.net/u013719339/article/details/80563247词组辨析,记忆方式首先,理解一下数组指针和指针数组这两个名词:“数组指针”和“指针数组”,只要在名词中间加上“的”字,就知道中心了——数组的指针:是一个指针,什么样的指针呢?指向数组的指针。指针的数组:是一个数组,什么样的数组呢?装着指针的数组。...转载 2018-07-24 21:52:02 · 230 阅读 · 0 评论 -
结构体字节对齐理解与代码分析
博客原文:http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.htmlhttps://blog.csdn.net/sno_guo/article/details/8042332https://blog.csdn.net/wshini7316/article/details/85375721、内存对齐的概念在用s...转载 2018-11-15 19:44:18 · 227 阅读 · 0 评论 -
C语言可变参数简析
今天在看代码的时候,看到了这样一段调试的代码,搞不清楚(...)这个是什么意思,看了下相关资料,简单记录下。#ifdef DEBUG#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)#else#de...转载 2018-11-14 19:55:20 · 195 阅读 · 0 评论 -
关于C语言全局变量的定义和用法
在单片机编程中经常会用到全局变量,假设要在a.c文件中用到b.c文件定义的变量,我们应该怎样定义、怎样引用才能让程序看起来干净整洁呢?下面简单记录一下假设现在有3个c文件,a.c、b.c、main.c;2个头文件,a.h,b.h要在main.c文件中用到a.c和b.c文件中的变量,(1)可以在a.c文件中【int global_a = 0;】,在a.h中申明【extern int gl...原创 2018-11-20 21:13:03 · 13102 阅读 · 0 评论 -
C语言ASSERT宏
一、assert函数的目的:断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位,并且输出信息很详细,可以很好地解决大多数C语言编译器错误信息输出不详细的问题 二、assert宏的原型,assert在哪里定义的C语言中,assert断言的原型定义在<assert.h>文件中。assert是一个宏定义,并不是一个函数。其作用是先计算表达式 expression ,...转载 2018-12-08 19:57:41 · 896 阅读 · 0 评论 -
VS2013使用C库函数,出现错误提示,使用不安全函数,use _CRT_SECURE_NO_WARNINGS
在VS 2013 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误:error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See...转载 2018-12-09 10:53:02 · 839 阅读 · 0 评论 -
C语言指针理解---一维数组作函数参数的用法
一维数组做函数参数的用法:当一维数组做函数参数的时候,会退化为指针 一维数组做函数参数的时候,c/c++编译器会做优化 int a[10] ----->int a[] ---->int *a 所以数组作函数参数的时候只能传指针 3.函数调用的时候,把数组首地址和有效数据长度传给被调用函数才是...原创 2019-04-11 16:08:28 · 2998 阅读 · 0 评论 -
C语言指针理解 --- 代码配合图形讲解内存四区
#define _CRT_SECURE_NO_DEPRECATE#include "stdlib.h"#include "string.h"#include "stdio.h"//c++编译器优化char *getStr1(){ char *p = "abcd1"; //这里定义的abcd1放在全局区 return p;}char *getStr2(){ cha...原创 2019-04-12 18:28:38 · 73 阅读 · 0 评论 -
C语言指针理解---写代码测试堆栈的生长方向
1、测试堆stack的生长方向#include <stdio.h>#include <stdlib.h>//栈属性/*栈是向下生长的栈的生长方向和内存空间buf存放方向两个不同的概念*///堆是向上生长的//演示:stack生长方向int main(){ float *p1 = NULL; int *p2 = NULL; int a ...原创 2019-04-12 19:45:49 · 370 阅读 · 0 评论 -
C语言---野指针的产生及避免(内存图解释说明)
#include <stdio.h>#include <stdlib.h>int main(void){ char buf[100]; int a = 10; int *p; //给p分配4字节的内存 p = &a; *p = 20; { char *p2 = NULL; //分配4个字节的内存、栈区也叫临时区 p2 = (c...原创 2019-04-12 20:10:14 · 365 阅读 · 0 评论 -
offsetof宏与container_of宏
说明:Linux内核中这两个宏用的非常多,所以在这里总结下1、offsetof宏作用:计算一个结构体成员变量在这个结构体中的偏移量 我之前写过一篇如何计算结构体偏移量的文章,虽然可以手工计算,但是结构体成员太多的话,手工肯定是不现实的,所以Linux定义了这样一个宏。https://blog.csdn.net/weixin_42445727/article/de...原创 2019-05-12 22:31:21 · 241 阅读 · 0 评论 -
内核源码中遇到不会解析的宏怎么办?
在分析内核源码的时候,会碰到各种奇怪的宏定义,凭自己脑子分析,感觉完全转不过来,不得不感叹C语言确实强大。废话少说,下面给出一个实例分析uboot的时候,遇到这种宏,完全懵逼下面给出具体的解决过程1、找到在哪里引用这个宏的2、将宏定义和引用宏的代码放到一个C文件3、gcc xxx.c -E -o xxx.i进行预处理源码是这样的/*遇到不会解析的宏如...原创 2019-06-08 21:15:44 · 328 阅读 · 0 评论 -
可重入函数与不可重入函数
引言 在早期的编程中,不可重入性对程序员并不构成威胁;函数不会有并发访问,也没有中断。在很多较老的 C 语言实现中,函数被认为是在单线程进程的环境中运行。不过,现在,并发编程已普遍使用,您需要意识到这个缺陷。本文描述了在并行和并发程序设计中函数的不可重入性导致的一些潜在问题。信号的生成和处理尤其增加了额外的复杂性。由于信号在本质上是异步的,所以难以找出当信号处理函数 触发某个不...原创 2019-07-20 22:24:52 · 486 阅读 · 0 评论 -
C语言测试机器大小端的方法
关于大端模式与小端模型的介绍,可以参看我之前写的一篇博客,这里不再赘述https://blog.csdn.net/weixin_42445727/article/details/90700309那么如何判定一个机器是大端模式还是小端模式呢?这里给出两种方法方法一:利用数据转换的截断特性void Judge_endian(){ int a = 12345678; //这里随便...原创 2019-07-27 14:33:51 · 224 阅读 · 0 评论 -
C语言内存分区(堆,栈,全局/静态存储区,自由存储区,代码区)与可执行程序的三段-(Text段,Date段,Bss段)
程序运行之前我们要想执行我们编写的c程序,那么第一步需要对这个程序进行编译。 预处理:宏定义展开、头文件展开、条件编译,这里并不会检查语法 编译:检查语法,将预处理后文件编译生成汇编文件 汇编:将汇编文件生成目标文件(二进制文件) 链接:将目标文件链接为可执行程序 当我们编译完成生成可执行文件之后,我们通过在linux下size命令可以查看一...原创 2019-07-27 21:38:31 · 823 阅读 · 0 评论 -
C语言定义结构体的几种方法
1. 先定义结构体类型,再定义结构体变量。struct student{ char no[20]; //学号 char name[20]; //姓名 char sex[5]; //性别 int age; //年龄}; struct student stu1,stu2;//此时stu1,s...原创 2018-07-24 19:11:43 · 38418 阅读 · 2 评论