C
poject
这个作者很懒,什么都没留下…
展开
-
linux C 语言 数组初始化 字符串自动连接
#include <stdio.h>#include <stdlib.h>#include <string.h>static const char dname[] = "/dev/" "aaa" "/ccc";int main(void){printf("%s\n", dname);return 0;}//打印结果如下/...原创 2020-01-14 09:07:28 · 502 阅读 · 0 评论 -
main函数的参数
#include<stdio.h>int main(int argc, char** argv){ printf("%x \n",argc); printf("%s \n",argv[0]); printf("%s \n",argv[1]); printf("%s \n",argv[2]); printf("%s \n",argv[3原创 2018-12-17 17:33:32 · 94 阅读 · 0 评论 -
C 关于错误 errno stderr perror stderror strerror
1)errno表示错误代码。 记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义;2)stderr是linux(unix)标准出错输出。是不带缓冲的,这使得出错信息可以直接尽快地显示出来。linux中的一个进程启动时,都会打开三个文件:标准输入、标准输出和标准出错处理。通常这三个文件都与终端联系。这三个文件分别对应文件描述符0、1、2。系队统自定义了三个文件指针s...原创 2018-12-19 11:09:37 · 1662 阅读 · 0 评论 -
linux 线程创建 同步 资源回收
例子1:互斥锁 + 条件变量/*主线程:创建两个线程,创建完了等待两个线程同步,并等待他们退出线程1: 1)打印 XXX 2) 如果主程序进入等待状态叫醒他 3) 退出的时候自己回收资源线程2: 1)打印 XXX 2) 如果主程序进入等待状态叫醒他 3)等待线程1 退出后*/#include<stdio.h>#include<stdlib.h>#i...原创 2019-01-04 15:26:30 · 270 阅读 · 0 评论 -
linux fork 多进程创建
1)fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。2)fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。#include <stdio.h>#include <stdlib.h>#...原创 2019-01-01 14:06:10 · 1177 阅读 · 0 评论 -
linux mmap映射区
主要用途如下:1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间(fork 之后,在子进程中操作描述符而不用创建)3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中(进程通信)4、大文件的读取 待续: https://www.cnblogs....转载 2019-01-03 13:33:05 · 410 阅读 · 0 评论 -
linux 进程通信 socket
1)服务器端:#include <netinet/in.h>#include <signal.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h> #define DATA_LEN 40 //data numberint main(int argc,...原创 2019-01-03 14:38:00 · 702 阅读 · 0 评论 -
C语言 printf
一)实现自己的printf#include <stdio.h>#include <string.h>#include <stdarg.h>// printf with formatvoid my_printf(char *fmt, ...){ va_list ap; //char * int d; char c, *s...原创 2019-01-08 18:49:13 · 1024 阅读 · 0 评论 -
C语言 __builtin_expect 作用
用于优化代码执行效率,提高预读指令的命中率,避开跳转指令影响!推荐 : https://my.oschina.net/moooofly/blog/175019//g.c// !!(x) 强制转成 bool型#define LIKELY(x) __builtin_expect(!!(x), 1)#define UNLIKELY(x) __builtin_expect(!!(x), 0...转载 2019-01-09 14:06:28 · 1076 阅读 · 0 评论 -
gnu c 长度为0的数组的使用
长度为的数组在标准c和c++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为。但在GNUc中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项。struct description{ int length; char contents[0];};struct description *thisline = (struct desc...转载 2019-02-25 13:34:29 · 178 阅读 · 0 评论 -
嵌入式 笔试题
XXX)指出下列程序的运行结果: int main() { int a[10] = { 0,1,2,3,4,5,6,7,8,9 }; memcpy(a + 3, a, 5); for (int i = 0; i<10; i++){ printf("%d ", a[i]); } return 0; }/...原创 2019-04-08 15:14:07 · 690 阅读 · 0 评论 -
C语言 结构体变量赋值
typedef struct{ u16 year; u8 month; u8 day; u8 hour; u8 minute; u8 second; u8 reserved;} utc_time_t;utc_time_t time1;utc_time_t time2;utc_time_t * p_time;time1.year = 2019;ti...原创 2019-05-30 17:08:24 · 5222 阅读 · 0 评论 -
C语言 关于优化
(一)应用级: 1)设计逻辑 2)(二)算法语言: 1)优化下面的for循环优化前: for(int i=0;i<1000;i++){ for(int j=0;j<100;j++){ for(int k=0;k<10;k++){ function(i,j,k); } } }...原创 2019-08-04 15:37:26 · 307 阅读 · 0 评论 -
C语言 关于位操作
1、关于负数移位:负数的二进制表示为 正数 取反 +1 右移: 高位补1(即 补上符号位)其他位向右移动1位 eg. 1) char n = -1; // ~0x01 +1 = ~(0000 0001) +1 = (1111 1110) +1 = (1111 1111) = 0xFF; //=>不管向右移动多少位,值都是 0xFF(-1) 2) ...原创 2019-08-13 10:18:31 · 795 阅读 · 0 评论 -
C 内存 关于字节对齐分配内存 malloc free
一)背景: 硬件原因:有的平台或者特定的硬件对内存访问有对齐要求 性能原因:cpu读取不对齐的内存可能会造成两次读取操作,影响性能二)代码实现例:比如要求 8bit 对齐,内存只能是8的倍数 aligned_malloc( 17, 8); 自己实现代码的关键是怎么存储原始的malloc地址信息,以及 怎么得到合适的内存地址typedef ...原创 2018-12-26 13:55:47 · 1422 阅读 · 0 评论 -
linux 进程通信 共享内存
共享内存:代码,编译,用 readmehttps://github.com/tutern/base_accumulation/tree/master/linux/process_sharmemory原创 2018-12-20 17:07:35 · 99 阅读 · 0 评论 -
linux 进程通信 消息队列
1)2)3) 4)发送#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h...原创 2018-12-19 17:31:49 · 84 阅读 · 0 评论 -
大小端问题
1、大端与小端的概念以数据 0x1234567890ABCDEF为例子: A)大端模式(Big-Endian):字面值的高位放在实际物理地址的低位 低地址0x0000F000 -----------------> 高地址 0x0000F007 0x12 | 0x34 | 0x56 | 0x78 | 0x90 | 0xAB | 0xCD ...原创 2018-02-23 16:54:16 · 328 阅读 · 0 评论 -
C 指针 数组
//1 数组名称 与指针 int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); // 2,5 //说明: &g+1的意思是数组类型的常量指针加一 即 数组长度加一 printf("%0x %0x \n", (a+1), (&a+1)); // a+1...原创 2018-11-15 16:31:54 · 177 阅读 · 0 评论 -
C指针 三维动态数组创建
#include "stdafx.h"#include <stdio.h>#include <stdlib.h>//create 3D array add init cell 0int*** createArray3D(int row, int col, int cel){ int *** arr_head = NULL; int ** row_head...原创 2018-02-23 16:57:44 · 428 阅读 · 0 评论 -
elf 文件初识-变量存储
收藏可参考的文章:https://www.cnblogs.com/LiuYanYGZ/p/5574602.html.data 初始化过的全局变量 (含初始化静态变量).bss 未初始化的全局变量(包括 函数内外的未初始化的静态变量).rodata 只读的变量(const)1)关于常量 和 普通变量int* const globle_A = 10; // .rodatacon...原创 2018-11-02 18:08:15 · 749 阅读 · 0 评论 -
关于程序的入口函数(main _start...)
参照来源:https://blog.csdn.net/cherisegege/article/details/80297320ld有多种方法设置进程入口地址, 按一下顺序: (编号越前, 优先级越高)1, ld命令行的-e选项2, 连接脚本的ENTRY(SYMBOL)命令 eg. ENTRY(_start) /* Entry point of applicati...转载 2018-11-13 17:00:00 · 14687 阅读 · 0 评论 -
GCC编译过程与动态链接库和静态链接库(未整理)
来源:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6410588.html根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。而动态库是在程序执行的时候被链接的。程序执行完,库仍需保留在系统上,以供程序运行时调用。链接静态库从某种意义上来说是一种复制...转载 2018-11-13 18:17:18 · 1300 阅读 · 0 评论 -
关于内存对齐
内存对齐可以用一句话来概括:“数据项只能存储在地址是数据项大小的整数倍的内存位置上”例如int类型占用4个字节,地址只能在0,4,8等位置上。字节对齐的缘故,如下的结构体的占用内存是一样struct A{ char a; // 1byte 实际占用 4 byte int b; //4byte 实际占用 4 byte char c; /...转载 2018-11-08 14:10:24 · 102 阅读 · 0 评论 -
C语言 volatile 和 restrict 关键字
(一) volatile1、背景:关于编译器的优化在线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。当该寄存器在因别的线程...转载 2018-11-15 14:32:18 · 549 阅读 · 0 评论 -
C语言 register关键字
来源:https://www.cnblogs.com/kingqinwang/p/5097335.html一、概念register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。因为,如果定义了很多register变量,可能会超过CPU的寄存器个数,超过容量。所以只是可能。寄存器其实就是一块一块小的存储空间,只不...转载 2018-11-15 14:37:42 · 433 阅读 · 0 评论 -
单项链表操作
using namespace std;struct ListNode{ int dat; ListNode* next;};ListNode * head = NULL;ListNode * createNode(void){ ListNode * newNode = (ListNode*)malloc(sizeof(ListNode) * 1); retu...原创 2018-11-12 15:13:52 · 146 阅读 · 0 评论 -
关于 for(;;); 和while(1);的区别
(一)gcc编译后好看汇编代码发现无区别:#include <stdio.h>int main(void){#if 1 while(1) { }#else for(;;) { }#endifreturn 0;}$ gcc -E a.c -o a.i$ gcc -S a.i -o a.s//查看两个文件相应的汇编代码,发现是一样的; 都是直接 ...原创 2018-11-14 12:38:33 · 1559 阅读 · 0 评论 -
GCC 编译链接 以及相关参数
官方文档: https://gcc.gnu.org/onlinedocs/pdf版本下载:https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc.pdf1) 预处理gcc -E test.c -o test.i2) 编译 为汇编代码(Compilation)gcc -S test.i -o test.s3) 汇编...原创 2018-11-14 18:13:54 · 1853 阅读 · 0 评论 -
C语言 define 关键字
1)取出两个数值中的最小值#define MIN(A,B) (((A)>(B))? (B):(A))2)用宏定义实现一个32 int类型变量 取绝对值#define ABS(n) (((unsigned int)n>>31 == 0x1) ? (-n):(n))#define ABS2(n) ((n ^ (n >> 31)) - (n >> 3...原创 2018-11-16 10:17:01 · 3152 阅读 · 1 评论 -
C 语言 __attribute__ 关键字
来源: https://blog.csdn.net/tabactivity/article/details/78558457attribute是GNU C特色之一,在iOS用的比较广泛.系统中有许多地方使用到. attribute可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute)等.函数属性(...转载 2018-11-16 15:00:10 · 1264 阅读 · 0 评论 -
c指针作为参数传递以及指针的指针
#include "stdio.h"void pointer(int *p){ int a = 11; printf("\n\nEnter function"); printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p); *p =11; printf("\nthe p is point ...转载 2018-03-15 16:53:45 · 349 阅读 · 0 评论