![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
find12
这个作者很懒,什么都没留下…
展开
-
linux下,可以定义“变长数组”?
原文链接如题,今天在ubuntu环境下,看到别人的代码:C/C++ code? 1 2 3 4 intlen; getlen(&len);//获得长度 charbuf[len];//定义“变长数组”!! ...转载 2021-01-18 00:22:57 · 468 阅读 · 0 评论 -
C语言中malloc申请的空间和直接定义变量申请的空间有什么区别?为什么要有malloc这种形式?
作者:大卫德刘链接:https://www.zhihu.com/question/404926433/answer/1318010429来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。定义变量得到的内存,在它被定义的作用域结束之后(一般就是定义语句所在的大括号),就会被释放,而malloc得到内存可以存活到被free的时间例如int *f() { int n = 10; return &n;}int *g() { in.转载 2021-01-18 00:20:36 · 2161 阅读 · 0 评论 -
Linux 循环创建多个线程 / Linux 线程概念
这里说一下相关的基础知识:线程概念什么是线程LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下)进程:独立地址空间,拥有PCB线程:也有PCB,但没有独立的地址空间(共享)区别:在于是否共享地址空间。独居(进程);合租(线程)。Linux下:线程:最小的执行单位 进程:最小分配资源单位,可看成是只有一个线程的进程。Linux内核线程实现原理类U...转载 2021-01-18 00:18:54 · 552 阅读 · 0 评论 -
Linux 下c获取当前时间(精确到秒和毫秒或者微秒)
获取当前的时间的秒数和微秒数本方法需要用到gettimeofday()函数,该函数需要引入的头文件是 sys/time.h 。函数说明int gettimeofday (struct timeval * tv, struct timezone * tz)1、返回值:该函数成功时返回0,失败时返回-12、参数struct timeval{long tv_sec; //秒long tv_usec; //微秒};struct timezone{int tz_minuteswest; //和转载 2021-01-18 00:15:04 · 1685 阅读 · 0 评论 -
对于CRITICAL_SECTION用法的介绍和理解
转载来源http://blog.sina.com.cn/s/blog_7953cead0100osnt.html 很多人对CRITICAL_SECTION的理解是错误的,认为CRITICAL_SECTION是锁定了资源,其实,CRITICAL_SECTION是不能够“锁定”资源的,它能够完成的功能,是同步不同线程的代码段。简单说,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改,以指明哪一个线程占用了它。而此时,并没有任何资源被“锁定”。不管什么资源,其它线...转载 2020-09-13 11:29:20 · 745 阅读 · 0 评论 -
C语言中的__FILE__、__LINE__和__func__等预定义跟踪调试
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。下面预定义宏表,被我抄了下来。__LINE__ :当前程序行的行号,表示为十进制整型常量 __FILE__ :当前源文件名,表示字符串型常量 __DATE__ :转换的日历日期,表示为Mmm dd yyyy 形式的字符串常量,Mmm是由asctime产生的。 __TIME__ :转换的时间,表示"hh:mm:ss"形式的字符串型常量,是有ascti...转载 2020-09-13 11:20:16 · 212 阅读 · 0 评论 -
C语言函数参数的传值和传指针有什么区别?
原文链接前言函数传参有三种传参方式:传值、传址、传引用。我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。传值我们在初学C语言的时候就被老师教过,下面的方式是无法交换a和b的值的:#include<stdio.h>voidswap(inta,intb){inttemp=a;a=b;b=temp;pri...转载 2020-09-10 23:39:32 · 1192 阅读 · 1 评论 -
C语言指针强制类型转换
原文链接概要:C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。例如,定义如下:int a;float b;double c;long double d;(假设它们所占的字节分别是4、8、8、10,..转载 2020-09-02 22:27:57 · 3883 阅读 · 0 评论 -
宏中使用 return 和逗号表达式
原文链接最近在移植一个开源代码, 调试时发现怎么都跟预期的结果不一样, 函数未执行完就退出了, 困扰了我好几天, 今天偶然间看到宏定义的内容, 然后才发现是在宏中执行了退出, 原来, 宏还可以这么用, 今天就分享出来, 避免大家今后踩坑.1. 示例代码#include <stdio.h>#define TRUE 1#define FALSE 0#define ERROR_MSG(msg) return printf("%s", msg), 0int main(){ p转载 2020-09-02 22:24:29 · 995 阅读 · 0 评论 -
深度理解do{} while(0)语句的作用
原文链接深度理解do{} while(0)在linux内核中常常会看到do{} while(0)这样的语句,有人疑惑,认为无意义,因为他只执行一次,加不加do{} while(0)小过失完全一样的,那你就错了,没有完全了解do{} while(0)。下面看一个例子:定义一个宏:#define SAFE_FREE(p) do{free(p); p=NULL} while(0)假设这里去掉do{....} while(0),及定义为:#define SAFE_FREE(p...转载 2020-09-01 23:33:26 · 174 阅读 · 0 评论 -
bool(*pn)(int x,int y))是什么意思
原文链接pn是一个函数指针,指向一个函数这是函数指针。函数指针pn 指向一个du 返回值为bool类型,参zhi数为int x,int y的函数。例如 bool IsMax(int a,int b){return a>b;}void main(){bool (*pn)(int x,int y);pn = IsMax;int a =5,b=3;count<<pn(5,3)<<endl;}//输出daoTrue...转载 2020-09-01 22:11:26 · 611 阅读 · 0 评论 -
opencv打开摄像头并添加时间水印
#include<opencv2/opencv.hpp>#include<iostream>#include <time.h>#include <time.h>using namespace std;using namespace cv;void drawText(Mat & image, char* time);int main(int argc,char **argv){ VideoCapture capture(0.原创 2020-06-01 14:44:37 · 860 阅读 · 0 评论 -
时间处理 c++ 獲取當前系統時間 1. 時間戳形式 2. char *形式[轉]
/* ctime example */#include <stdio.h>#include <time.h>#include <iostream>using namespace std;int main (){ time_t rawtime; time ( &rawtime ); printf("%ld\n", &rawtime); printf ( "The current local ti...转载 2020-06-01 13:48:35 · 184 阅读 · 0 评论 -
struct tm,time,localtime,mktime,ctime,gmtime,difftime,asctime,strftime
1. struct tmint tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;转载 2020-06-01 11:41:53 · 234 阅读 · 0 评论 -
关键字volatile有什么含意 并给出三个不同的例子
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) ...原创 2020-02-14 18:17:31 · 402 阅读 · 0 评论 -
*(a+1), *(ptr-1)
main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int...原创 2020-02-13 18:51:01 · 1252 阅读 · 0 评论 -
什么是预编译?何时需要预编译?
预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。何时需要预编译:总是使用不经常改动的大型代码体。 程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。...转载 2020-02-13 16:34:47 · 6620 阅读 · 1 评论 -
栈和队列、堆、堆栈的区别?
队列(queue)是先进先出,有出口和入口,先进去可以先出来。栈(stack)就像一个箱子,后放上去的,可以先出来堆(heap)是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。...转载 2020-02-13 11:48:10 · 461 阅读 · 0 评论 -
union、struct、class占用的字节数
内存对齐在32位系统下,gcc的对齐方式为1,2,4,默认为4字节对齐。在64为系统下,gcc的对齐方式为1,2,4,8,默认为8字节对齐。union变量所占用的内存长度等于最长的成员的内存长度。struct和class内存中存储形式一样(函数不占内存空间)。union当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Prog...转载 2020-02-10 23:40:25 · 3814 阅读 · 1 评论 -
C语言 求出一组数据的最小值及最小值在这组数据中的位置
#include<stdio.h>int main(){ int a[100],n,i,min; printf("输入数组元素个数:\n"); scanf("%d",&n); printf("输入%d个整数:\n",n); if(n<1||n>100) return 0;//程序读到return后就不再执行 for(i=0;i<n;i++...转载 2019-11-29 17:43:25 · 7682 阅读 · 0 评论 -
逻辑运算符、位运算符
1,逻辑运算符:&& 逻辑与,可以理解为并且的意思.|| 逻辑或,可以理解为或者的意思,也就是条件可以2取一! 逻辑非 (一元表达式)原创 2019-09-06 00:15:32 · 106 阅读 · 0 评论 -
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。 #define BIT3 (0x1 << 3)static int a;void set_bit3(void){ a |= BIT3;}void clear_bit3(void){ a &= ~BIT3;}...转载 2019-09-06 00:08:22 · 3963 阅读 · 0 评论 -
数组指针与指针数组
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它 是“指向数组的指针”的简称。下面到底哪个是数组指针,哪个是指针数组呢:A)int *p1[10];B)int (*p2)...转载 2019-09-05 23:16:27 · 195 阅读 · 0 评论 -
数组赋值
数组的初始化(初始化就是在定义时赋值): 1、满数初始化 int arr[5] = {1,2,3,4,5}; //arr[0]-->1 arr[4]-> 5 2、部分初始化 int arr[5] = {1,2,3}; //arr[0]=1, arr[1]=2,arr[2]=3,arr[3]=0,arr[4]=0 根据上面可得出: 想在初始化时...原创 2019-07-25 15:15:03 · 39618 阅读 · 0 评论 -
运算符转换
原创 2019-09-06 00:18:53 · 270 阅读 · 0 评论 -
进程与线程的区别与联系
进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切...原创 2019-09-06 00:51:07 · 160 阅读 · 0 评论 -
可重入和不可重入
原文链接重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象。一般浮点运算都是由专门的硬件来完成,举个例子假设有个硬件寄存器名字叫做FLOAT,用来计算和存放浮点数的中间运算结果假设有这么个函数void fun(){//...这个函数对FLOAT寄存器进行操作}假如第一次执行,有个对浮点数操作运算的结果临时存在FLO...转载 2019-09-13 21:45:06 · 504 阅读 · 0 评论 -
C 关于unsigned int compzero = ~0;
C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别!unsigned int zero = 0; unsigned int compzero = 0xFFFF;对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:unsigned int compzero = ~0; ...转载 2019-09-13 22:24:19 · 456 阅读 · 0 评论 -
以下程序的打印结果是多少? (逗号运算符)
#include <stdio.h>int main (int argc, char *argv[]){ int a[3][2] = {(1,2),(3,4),(5,6)}; int *p = a[0]; printf("%d\n",p[0]); return 0;}输出答案为:2int a[3][2] = {(1,2),(3,4),(5,6)};上面赋值...原创 2019-09-14 18:11:10 · 256 阅读 · 0 评论 -
结构体成员的访问(->和 . )
定义结构体指针,访问成员时就用->定义结构体变量,访问成员时就用.例如:struct A {int a;char b;};struct A q; 访问成员就用:q.a;struct A *p; 访问成员就用:p->a;...转载 2019-09-16 00:25:52 · 2003 阅读 · 0 评论 -
用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数正确答案: D 你的答案: D(正确)int *a[10];int (*a)[10];int (*a)(int);int (*a[10])(int);int (*a[10])(int); //函数指针的数组,指向有一个参数并且返回类型均为int的函数的数组int ...原创 2019-09-05 23:09:27 · 9607 阅读 · 0 评论 -
c语言函数对应头文件备注
malloc #include<stdlib.h>memset #include <string.h>原创 2019-08-13 00:50:25 · 564 阅读 · 0 评论 -
int main(int argc, char **argv) 、char** argv与char *argv[]区别
参考链接int argc, char **argv 用于运行时,把命令行参数传入主程序。argc --命令行参数总个数,包括可执行程序名。argv[i] -- 第 i 个参数。argv[0] --可执行程序名。例如运行:abc.exeargc 等于 1, argv[0] 是 "abc.exe"例如运行:rec.exe 4 5.2argc 等于 3, argv[0...转载 2019-07-26 01:13:17 · 1029 阅读 · 0 评论 -
大小端及判定方式
大小端:大端存储:低字节数据存放在高地址,高字节数据存放在低地址小端存储:低字节数据存放在低地址,高字节数据存放在高地址STM32F101xx和STM32F103xx仅支持小端模式,虽然Cortex-M3是大小都支持的。判定方式一、利用联合体在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。联合体变量的各个成员...原创 2019-07-26 01:08:35 · 394 阅读 · 0 评论 -
C语言递归实现n的阶乘(n!)
原文链接非负整数n的阶乘可以表示为n! (读作:n的阶乘),其定义如下:n! = n·(n - 1)• (n - 2)· …·1 (n大于或等于l),且n = 0时,n! = l例如,5 ! = 5·4·3·2·1 = 120。请编写一个程序,读入一个非负整数,计算并输出其阶乘。思路: 阶乘 就是每次用自己乘以自己-1,然后用自己-1在乘自己-1-1……利用递归的性质可以很好的实现这...转载 2019-07-26 00:50:11 · 9793 阅读 · 0 评论 -
函数指针,malloc,static
指针函数:返回值为指针的函数#include <stdio.h> 2 3 4 char *fun() 5 { 6 char str[] = "hello world!"; 7 return str; 8 } 910 int main()11 {12 char *p = fun();13 puts(p...原创 2019-07-26 00:32:56 · 577 阅读 · 0 评论 -
函数储存类型
函数定义:存储类型 数据类型 函数名(数据类型 形参1,数据类型 形参2,.....) //函数头 { 函数体; 返回值;(return 返回值;) } 存储类型:函数入口地址的存储类型 (函数名就是函数的入口地址) 数据类型:返回值的数据类型 函数名:遵循标识符的命名规则...原创 2019-07-26 00:28:05 · 1465 阅读 · 0 评论 -
const用法
int a = 10; int *p = &a; 此时p可以被修改,*p也可以被修改 那么当使用const修饰时,const到底修饰的是p还是*p呢?与a无关 const int *p = &a; 此时const修饰的是*p,也就是p可以被修改,*p不能被修改 int *const p = &a; 此时const修饰的是p,也就是*p可...原创 2019-07-25 22:19:34 · 119 阅读 · 0 评论 -
自己实现strcpy,strncpy,strncat,strcmp,strlen的功能
原文链接#include <stdio.h>#define MAX_SIZE 1024char * my_strcpy(char *dest,char *src){char *temp = dest;while(*src != '\0'){*temp = *src;temp++;src++;}*temp = '\0';return dest;}char...转载 2019-07-25 18:08:12 · 113 阅读 · 0 评论 -
scanf()函数中%[]格式控制符用法
原文链接此格式控制符的基本格式为:%[scanfset]scanfset 有两种形式:一种是以非 “^” 字符开头的 scanset , 表示在读入字符串时将匹配所有在 scanfset 中出现的字符,遇到非scanfset 中的字符时输入就结束;另外一种形式是以 “^” 字符开头的scanfset ,表示在读入字符串时将匹配所有不在scanfset 中出现的字符,遇到scanfset 中...转载 2019-07-25 14:46:39 · 712 阅读 · 0 评论