
《编程语言》C语言杂记
文章平均质量分 87
Bruceoxl
BruceOu,于2017年10月13日开始在优快云上写博客,博客专注于嵌入式开发、人工智能等。欢迎各位朋友来访!
邮箱: ouxiaolong@bruceou.cn
展开
-
《C语言杂记》C语言内存泄露分析与检测
在堆上分配的内存,没有及时释放掉,以便后面其它地方可以重用。在C/C++中,内存管理器不会帮你自动回收不再使用的内存。如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露。一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃。内存访问越界,使用的内存超出了向系统申请了一块内存,覆盖该空间之后的一段存储区域,导致系统异常。原创 2023-07-22 22:53:58 · 1255 阅读 · 0 评论 -
《C语言杂记》C语言异常处理之 setjmp()和longjmp()
ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序。ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程。ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。接下来笔者通过不同的例子来说明这些组合键的差异。字符串输入#include <iostream> #include <vector>#include <string>using namespace std;原创 2021-10-18 22:32:54 · 746 阅读 · 0 评论 -
《C语言杂记》内存泄漏跟踪
废话不是很多说,内存泄漏工具使用Linux的mtrace,笔者使用的是Ubuntu14.04自带此工具。我们先写一段内存泄漏的代码。#include <stdlib.h>#include <stdio.h>int main(){ setenv("MALLOC_TRACE", "taoge.log", "1"); mtrace(); int *p = (int *)malloc(2 * sizeof(int)); retur原创 2021-10-18 22:16:17 · 852 阅读 · 0 评论 -
《C语言杂记》编译优化之__builtin_expect
最近在研究压缩算法的时候,看到了以下代码:#define LIKELY(c) (__builtin_expect(!!(c), 1))#define UNLIKELY(c) (__builtin_expect(!!(c), 0))在好奇心的驱使下,我决定一探究竟。1 __builtin_expect是啥其实可以从宏定义就能猜个大概,顾名思义,LIKELY ()指“很有可能”之意,而UNLIKELY ()指“不太可能”之意。这两个有啥用处呢,可以先看看GCC官方的解释。Built-in Func原创 2021-10-10 09:34:56 · 2231 阅读 · 0 评论 -
《C语言杂记》C语言结构体和联合体详解
1结构体概述C 语言中有很多数据类型,数据类型决定了变量存储占用的空间,以及如何解释存储的位模式。像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型,它允许存储不同类型的数据项。例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。这就可以使用结构体(Struct)来原创 2021-09-08 23:18:17 · 1932 阅读 · 0 评论 -
《C语言杂记》详解extern “C“
在嵌入式开发过程中,你是否经常看到类似下面的代码。#ifdef __cplusplus extern "C" {#endif……#ifdef __cplusplus}#endif下面我们就来深入剖析。很明显#ifdef/#endif、#ifndef/#endif用于条件编译,#ifdef _cplusplus/#endif _cplusplus——表示如果定义了宏_cplusplus,就执行#ifdef/#endif之间的语句,否则就不执行。在这里为什么需要#ifdef _cplusp原创 2021-08-22 00:05:46 · 1632 阅读 · 0 评论 -
《C语言杂记》解决 error c4996 ‘fopen‘ This function or variable may be unsafe
【问题描述】在Visual Studio中使用功能‘fopen’操作文件时,出现以下错误:error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.【问题分析】编译的信息表明‘fopen’不安全,推荐使用‘f原创 2021-08-12 21:48:03 · 6490 阅读 · 3 评论 -
《C语言杂记》静态库和动态库(Windows版)
4 Windows创建和使用静态库笔者这里使用的是VS2015,当然也可以使用其他工具。4.1生成静态库1.首先打开VS,先新建一个项目,选择win32控制台应用程序,当然选择win32项目也可以。2.接下来选择“下一步”进入应用程序设置,这里选择静态库并去掉预编译头,当然也可以在创建项目后去掉也是可以的。最后点击“完成”即可创建项目。3.创建头文件(.h)以及源文件(.cpp)StaticLib.h#ifndef _STATIC_LIB_H_#define _STATIC_LIB_H_原创 2021-07-31 20:06:11 · 1098 阅读 · 5 评论 -
《C语言杂记》静态库和动态库(Linux版)
1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通常把库文件存放在/usr/lib或/lib目录下。Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so作为后缀,静态链接库通常以.a作为后缀。何为静态库和动态库?静态库(Static library, Statically-linked library, LIB)或称静态原创 2021-07-31 06:48:59 · 885 阅读 · 1 评论 -
《C语言杂记》C语言字符数组与字符指针(指向字符串的指针)详解
C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,字符数组用法很简单我们还是来你看个例子吧。#include <stdio.h>#include <string.h>int main(){ char str[] = "hello world!\n"; int len = strlen(str), i; //直接输出字...原创 2019-03-28 20:23:08 · 4302 阅读 · 0 评论 -
《C语言杂记》C语言使用gets函数出现的警告问题
首先我们来看个程序。#include <stdio.h>#include <string.h>int main(int argc, char *argv[]){ char s[100]; printf("输入字符串:\n"); gets(s); printf("%s\n",s); return 0;}但是在编译的时候回出现如下警...原创 2019-03-15 09:13:30 · 16989 阅读 · 4 评论 -
《C语言杂记》C语言预处理
预处理:对一些预处理命令进行执行的过程 预处理命令:头文件包含;宏定义等,用#开头的一些命令。 在C语言中预处理命令不会直接被编译,而是在编译这些预处理命令时,将这些预处理命令进行解析,然后将预处理结果替换成真正的C语言能编译的C语句。 在编译之前,预处理命令define会自动将程序中所有的Pi替换成3.14.在编译时程序中是不会在存在预处理命令的。一)宏定义1)不带参数的宏定义 如:原创 2017-11-26 13:25:52 · 676 阅读 · 1 评论 -
《C语言杂记》C语言常见错误
对于刚学编程,刚接触C++的新手来说,编译运行报错是最头疼的一件事,爆出一堆英文,英语差一点的又不知道什么意思,所以也不知道如何去改,在此,我给大家传一份常见错误中英文对照表及简单解释,希望可以帮到大家: fatal error C1003: error count exceeds number; stopping compilation 中文对照:(编译错误)错误太多,停止编译 分析:修改之原创 2017-11-26 13:19:38 · 6408 阅读 · 1 评论 -
《C语言杂记》从getmemery()函数看内存管理、函数传参等一系列问题
从getmemery()函数看内存管理、函数传参等一系列问题 在C 面试题目中,会经常出现getmemery()函数的改错题,比如下面这道题, 例一:代码如下:#include <stdio.h> char *getmemery() { char p[] = "hello world!"; return p; } void main() {原创 2017-11-26 13:05:26 · 589 阅读 · 0 评论 -
《C语言杂记》动态内存分配
一:传统数组(静态数组)的缺点1:数组的长度必须事先指定,并且是常整数,不能是变量 int a[5]; 2:传统数组程序员无法由程序员释放,只能由系统释放。(并且只能在数组所在函数结束才能释放) 3:数组的长度在函数运行期间不能动态的扩充和缩小 4:A函数定义的传统数组,在A函数结束时,在B函数中是不能使用的,因为已经释放。也就是传统数组不能跨函数。区分:静态存储与内存的静态开原创 2017-11-26 13:01:06 · 463 阅读 · 0 评论 -
《C语言杂记》extern关键字
extern有两个作用,第一个,当它与”C”一起连用时,如: extern “C” void fun(int a, int b); 则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的, C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的”脾气”了 (不同的编译器采用的方法不一样),为什么这原创 2017-10-28 22:01:18 · 4712 阅读 · 0 评论 -
《C语言杂记》sizeof用法
一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof原创 2017-10-28 22:09:19 · 479 阅读 · 0 评论 -
《C语言杂记》static的作用
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容char a = 'A'; // global variablevoid原创 2017-10-28 22:17:00 · 470 阅读 · 0 评论 -
《C语言杂记》volatile关键字
简单的说,就是不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄存器中读取或者修改。 一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都原创 2017-10-28 22:19:29 · 456 阅读 · 0 评论 -
《C语言杂记》C语言必背18个经典程序
1、/* 输出9*9口诀。共9行9列,i控制行,j控制列。*/#include &quot;stdio.h&quot;void main(){int i,j,result;for (i=1;i&lt;10;i++){ for(j=1;j&lt;10;j++) { result=i*j; printf(&quot;%d*%原创 2017-11-21 11:36:16 · 4431 阅读 · 3 评论 -
《C语言杂记》理解字符串处理函数 strlen() strcpy() strcat() strcmp()
在linux C 编程中,我们经常遇到字符串的处理,最多的就是字符串的长度、拷贝字符串、比较字符串等;当然现在的C库中为我们提供了很多字符串处理函数。熟练的运用这些函数,可以减少编程工作量,这里介绍几个常用的字符串函数,并编写一些程序,如果没有这些库函数,我们将如何实现其功能;1.求字符串长度函数 strlen头文件:string.h 函数原型:size_t strlen(const char *原创 2017-11-23 11:14:00 · 4071 阅读 · 0 评论 -
《C语言杂记》C语言里的左移和右移运算
左移左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:int i = 1;i = i << 2; //把i里的值左移2位也就是说,1的2进制是000…0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000…0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有原创 2017-11-24 08:46:23 · 8727 阅读 · 0 评论 -
《C语言杂记》探讨scanf函数
1.空白符问题#include<stdio.h>int main(){ int a; printf("input the data\n"); scanf("%d\n",&a);//这里多了一个回车符\n printf("%d",a); return 0;}结果要输入两个数程序才结束,而不是预期的一个。why? 原因:用空白符结尾时,scanf会跳原创 2017-11-24 08:52:46 · 699 阅读 · 0 评论 -
《C语言杂记》深入了解scanf() getchar()和gets()等函数之间的区别
问题描述一:(分析scanf()和getchar()读取字符)scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1:int main() { char ch1, ch2; scanf("%c", &ch1);原创 2017-11-24 08:55:57 · 1480 阅读 · 0 评论 -
《C语言杂记》float和double在计算机存储解析
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而doub原创 2017-11-24 09:04:58 · 1053 阅读 · 1 评论 -
《C语言杂记》内存分配
程序在内存中是分段存储的。 代码段:存放语句转换的数字;程序运行时不可修改; 全局段:用来记录全局变量和静态变量的存储位置;不会随着程序的运行而改变; 栈:存放局部变量,块变量,形式参数和返回值的存储位置;随着程序的运行其大小将不断改变;函数调用时,开辟空间,函数调用结束收回其空间;不同调用函数之间遵循后进先出的原则。 堆:存放动态分布的存储位置;原创 2017-11-26 12:58:49 · 449 阅读 · 0 评论 -
《C语言杂记》const关键字
const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。const的作用(1)可以定义const常量,具有不可变性 (2)用于函数参数,便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) { ………} 编译器就会知道i是一个常量,不允许修改 (3)同宏定义一样,可以做到不变则已,一变都变! (4)可以保护被原创 2017-10-28 21:50:28 · 432 阅读 · 0 评论