
C programming
文章平均质量分 59
related to C programming
jasonxty
这个作者很懒,什么都没留下…
展开
-
C system()的返回值
比如如果grep call fail,它的返回值就是256。原创 2023-01-20 15:44:54 · 1657 阅读 · 2 评论 -
代码安全性和健壮性:如何在if和assert中做选择?
一、前言我们在撸代码的时候,经常需要对代码的安全性进行检查,例如:指针是否为空? 被除数是否为 0? 函数调用的返回结果是否有效? 打开一个文件是否成功?对这一类的边界条件进行检查的手段,一般都是使用 if 或者 assert 断言,无论使用哪一个,都可以达到检查的目的。那么是否就意味着:这两者可以随便使用,想起来哪个就用哪个?这篇小短文我们就来掰扯掰扯:在不同的场景下,到底是应该用 if,还是应该使用 assert 断言?写这篇文章的时候,我想起了孔乙己老先生的那个问题:茴香转载 2022-03-31 13:12:59 · 209 阅读 · 0 评论 -
do {...} while(0)
https://stackoverflow.com/questions/154136/why-use-apparently-meaningless-do-while-and-if-else-statements-in-macros用do {...} while(0),去做宏定义可以提高代码的健壮性。#define MY_MACRO(x) \do原创 2021-08-23 20:26:37 · 86 阅读 · 0 评论 -
通过swig将C/C++代码暴露给python
入门http://www.swig.org/Doc3.0/Introduction.html#Introduction可以通过include头文件的方式去定义.i文件。这样大大方便了.i文件的书写。实验发现函数可以不用加extern。%module example原创 2021-05-08 13:41:34 · 755 阅读 · 0 评论 -
什么时候会定_cplusplus宏
_cplusplusThe __cplusplus preprocessor macro is defined if the compilation unit is compiled with a C++ compiler. If defined, its value corresponds to the C++ standard that the compiler uses to compile a compilation unit.具体来说g++编译.c/.cpp,gcc编译.cpp...原创 2021-04-25 13:21:54 · 125 阅读 · 0 评论 -
opaque pointer
opaque pointer就是将对象封装在opaque pointer里面,暴露出可以作用于对象的API,只要API不变,其它调用这些API去访问对象的模块就可以独立于对象。感觉是一种提高高内聚低耦合代码的好方法。https://stackoverflow.com/questions/22447153/what-does-typedef-void-key-type-mean-in-c/22447219// Public api in a .h filetypedef void* xyz_k原创 2021-04-20 22:13:17 · 469 阅读 · 0 评论 -
利用mmap /dev/mem 读写Linux内存
使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。以下是我写的一个sample#include<stdio.h>#include<unistd.h>#include<sys/mman.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>.转载 2021-01-14 15:17:25 · 424 阅读 · 0 评论 -
SC5654开发【bug1】-\bin\sh.exe:*** Couldn‘t reserve space for cygwin‘s heap,Win32 error 0
因为对平头哥和RISC-V的好奇,买了一个SC5654的板子玩一玩。在用快速上手手册编译的时候遇到以下问题:\bin\sh.exe:*** Couldn't reserve space for cygwin's heap,Win32 error 0解决方法在这里找到https://stackoverflow.com/questions/18502999/git-extensions-win32-error-487-couldnt-reserve-space-for-cygwins-heap-原创 2020-09-03 21:49:27 · 294 阅读 · 0 评论 -
C从文件读取一行
fscanf(fp, "%[^\n]\n", line);orfgets(line, MAX_LINE, fp);原创 2020-08-21 08:57:14 · 1288 阅读 · 0 评论 -
man 2 gettimeofday 翻译
名字gettimeofday, settimeofday - get / set time概要#include <sys/time.h>int gettimeofday(struct timeval *tv, struct timezone *tz);int settimeofday(const struct timeval *tv, const struct timezone *tz);glibc需要的特征测试宏(查看 feature_test_macros(7)):翻译 2020-05-11 16:18:30 · 348 阅读 · 0 评论 -
man 3 system 翻译
名字system 执行一个shell命令概要#include <stdlib.h>int system(const char *command);描述system()库函数用fork(2)创建一个子进程,这个子进程通过execl(3)执行command指定的shell命令:execl("/bin/sh", "sh", "-c", command, (char*) 0);system()会在命令结束之后返回。在执行命令的过程中,对于调用system()的进程翻译 2020-05-09 15:51:54 · 302 阅读 · 0 评论 -
STDARG(3)翻译
名字stdarg, va_start, va_arg, va_end, va_copy可变参数列表。概要#include <stdarg.h>void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);void va_copy(va_list dest...翻译 2020-04-27 18:35:32 · 205 阅读 · 0 评论 -
strtok(3) man手册翻译
NAMEstrtok, strtok_r从字符串中提取符号组概要#include <string.h>char *strtok(char *str, const char *delim);char *strtok_r(char *str, const char *delim, char **saveptr);Feature Test Macro Requirem...翻译 2020-04-13 15:31:02 · 507 阅读 · 0 评论 -
getline(3) man手册翻译
GETLINE(3)名字getline, getdelim - delimited string input概要#include <stdio.h>ssize_t getline(char **lineptr, size_t *n, FILE *stream);size_t getdelim(char **lineptr, size_t *n, int deli...翻译 2020-04-13 13:06:13 · 481 阅读 · 0 评论 -
C语言函数参数,内存对齐问题
我们都知道C语言中,struct会做内存对齐,实际分配的内存出现比程序员预想的多。C语言函数参数传递的时候也会有类似的情形。但这个和struct内存对齐(https://stackoverflow.com/questions/4306186/structure-padding-and-packing)不一样,它不是插入同类型的数据而是忽略比较小的参数,然后widen这个参数。具体扩展到多大...原创 2020-03-31 13:58:26 · 571 阅读 · 0 评论 -
C语言部分初始化一个结构体
https://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structureIn C, objects are never partially initialised - if any part of them is initialised, the entire objec...原创 2019-12-10 15:19:15 · 1283 阅读 · 0 评论 -
__attribute__((unused)) variable attribute
Normally, the compiler warns if a variable is declared but is never referenced. This attribute informs the compiler that you expect a variable to be unused and tells it not to issue a warning if it is...原创 2019-12-02 09:26:31 · 256 阅读 · 0 评论 -
char* 和 char[] 的区别
char*是指针。char[]是数组。他们是不同的数据类型。原创 2019-06-14 14:05:57 · 1414 阅读 · 0 评论 -
Redis协议spec(翻译)
Redis客户端和Redis服务器通过一个叫做RESP(REdis Serialization Protocol,Redis序列化协议)的协议进行通讯。虽然这个协议是为Redis设计的,但是它也能被用在其它的客户端-服务器软件项目。RESP是以下几个方面妥协的结果:易于实现 快速解析 可读性好RESP可以序列化不同的数据类型,比如整型,字符串,数组。另外还有特定的类型表示错误。请求由...翻译 2019-06-06 10:52:57 · 550 阅读 · 0 评论 -
__attribute__((unused))的作用
在分析内核时注意到有些函数会有添加__attribute__((unused)),在gcc手册中找到了有关的解释:unused:This attribute, attached to a function, means that the function is meant to be possibly unused. GCC will not produce a warning...转载 2018-08-15 15:01:19 · 2451 阅读 · 0 评论 -
memset函数的作用
函数原型:void *memset(void *s, int ch, size_t n);将s中当前位置开始后面n个字节用ch的二进制值替换并返回s,n通常配合sizeof使用。 主要用来对s所开始的内存区域按字节赋值,注意int是4字节,long int是8字节,char是单字节。所以通常用来对数组进行初始化操作以及对struct进行清空操作,所以一般ch取0或者-1。原创 2016-11-09 10:11:53 · 633 阅读 · 0 评论 -
文件操作的一个细节 - 换行符"\n"和回车符"\r"
转自crazyingbird 问题始于社区的一个帖子,楼主的问题如下: “在C语言中,对一个不知道大小的文件进行读操作,我用fread()将文件的内容先放到一个缓存区,然后将缓存区中的内容打印出来,缓存区中的内容和文件中的内容不一样,好像是因为缓存区的空间比存储文件内容所需要的空间大了,不知道应该怎么解决” 这个问题我之前也碰到过,翻了一些C语言文件操作方面的资料,发现对于换行转载 2016-11-16 22:01:07 · 6844 阅读 · 0 评论 -
C语言中的static
利用static属性隐藏变量和函数名字 C程序员使用static属性在模块内部隐藏变量和函数声明,就像你在Java和C++中使用public和private声明一样。C源代码文件扮演模块的角色。任何声明带有static属性的全局变量或者函数都是模块私有的。类似的,任何声明为不带static属性的全局变量和函数都是公共的,可以被其他模块访问。尽可能用static属性来保护你的变量和函数是很好的编程习原创 2016-11-29 21:45:40 · 431 阅读 · 0 评论 -
C语言编译的各个阶段
C编译器通过下面的这几个阶段处理C源文件。不同的编译器实际的实现过程可能有所不同,但是主要行为都是一致的。阶段11)源文件(往往是一个由像UTF-8这样的多字节编码的文本文件)的字节都要做映射,通过某种方式将字符映射到源字符集中的字符。特别的,和操作系统相关的行结尾符统一由newline字符代替。 源字符集是一个多字节字符集,它将基本源字符集作为单字符子集,由下面的96个字符组成: a). 5翻译 2016-12-11 10:40:43 · 1790 阅读 · 0 评论 -
为什么每个C程序都需要一个叫做main的函数
当加载器运行时,它创建一个如下图的运行时存储器映像(存在一段较短的时间,在虚拟地址空间上)。在可执行文件中段头部表的指导下,加载器将可执行文件的的相关内容拷贝到代码和数据段,然后加载器跳转到程序的入口点,也就是符号_start的地址。在_start地址处的启动代码(startup code)是在目标文件ctr1.o(参考下面代码)中定义的,对所有C程序都是一样的。它会最终调用应用程序的main函数。原创 2016-12-11 14:21:04 · 6699 阅读 · 0 评论 -
理解程序调用以及由此引出的缓冲区攻击问题
在阅读《深入理解计算机系统》第三章,程序的机器级表示的时候,解开了以前学习C语言的时候的一些疑惑,在这里稍做记录。程序在调用另一个程序的时候涉及下面的这个数据结构——栈帧,这个数据结构是实现整个过程的关键。调用者程序调用(call指令)另一个被调用者程序的时候,首先调用者程序将将当前程序计数器的值(下一条指令的地址)保存(push)在栈帧中,再跳转到被调用者程序。然后被调用者程序保存原来的帧指针(原创 2016-12-03 15:01:22 · 391 阅读 · 0 评论 -
理解整数运算的属性以及溢出的检查
计算机执行的“整数”运算实际上是一种模运算形式。表示数字的有限字长限制了可能的值的取值范围,结果运算可能溢出。补码表示提供了一种既能表示负数也能表示正数的灵活方法,同时使用了与执行无符号算数相同的位级实现,这些运算包括加法,减法,乘法,甚至除法(需要一个偏移量)。无论运算数是以无符号形式还是以补码形式表示的,都有完全一样或者非常类似的位级行为。 C语言中的某些规定可能会产生令人意想不到的结原创 2016-12-04 17:54:59 · 3549 阅读 · 0 评论 -
C语言定时器
环境: ubuntu16.04 LTS i686 gcc5.4.0我们在写C程序的时候往往需要衡量一段代码的执行时间,方便程序的优化。所以我们需要写一个定时器程序。POSIX.1-2001提供了gettimeofday()函数可以用来获得系统相对于Epoch(1970-01-01 00:00:00 UTC) 的时间(微秒),POSIX.1-2008废弃了gettimeofday(),建原创 2016-11-27 11:18:10 · 11656 阅读 · 0 评论 -
怎样写出更快的C程序
由于存储器的设计和语言的存储安排,一个具有良好局部性的程序往往可以更快的执行。——总结自《深入理解计算机系统》局部性通常有两种不同的形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。总之,编写高速缓存友好的代码涉原创 2016-11-22 22:14:54 · 394 阅读 · 0 评论 -
C语言宏的几个注意点
宏定义 宏定义中要注意的主要有两点,一点是宏参数可能被evaluation多次。比如:#define max(A, B) ((A) > (B) ? (A) : (B))max(i++, j++) /* i和j中较大的值会被evaluation2次*/当然这里宏的好处是可以不用指定A和B的类型。 另一点是宏跟括号有关的时候可能会改变evaluation的顺序。比如#define square原创 2017-01-03 10:15:36 · 418 阅读 · 0 评论 -
Linux I/O函数(beta)
在学习使用C语言的时候,我们总会遇到各种各样的输入输出函数。fopen,open,read,write,scanf,printf等等。那么到底什么时候应该用什么,我么该如何选择呢,我之前总是有疑问。在认真学习了《csapp》《apue》之后,总算是有点眉目了。下面做一个记录。首先明确一下什么是输入输出,输入输出是在主存和外部设备之间拷贝数据的过程。输入输出是相对主存而言的。在编写C语言程序的时候,原创 2017-01-03 16:06:18 · 503 阅读 · 0 评论 -
C语言中的const,volatile,restrict用法总结
const, volatile, restrict是我们在程序中经常遇到的几个限定词,是时候好好总结一下了。本文转自http://www.jb51.net/article/42348.htmconst 变量声明中带有关键词const,意味着不能通过赋值,增量或减量来修改该变量的值,这是显而易见的一点。指针使用const则要稍微复杂一点,因为不得不把让指针本身称为const和指针指向的值称为co转载 2017-03-20 13:44:12 · 1210 阅读 · 0 评论 -
C语言的类型转换机制
由于C语言的隐式类型转换,经常让我感到迷惑或者带来bug。在这里翻译一下C标准的转换机制。 其实我人为,这种转换完全没有必要存在于语言层面。 总的来说首先保证转换精度,其次按照取模的方式转化为无符号整数。转换 有些操作符依赖于它们的操作数本身来进行操作数的类型转换。这一章就解释了这些转换带来的结果。1.Integral promotion 一个字符/短整型或者一个整数位,无论是不是有翻译 2017-05-24 20:56:27 · 856 阅读 · 0 评论 -
char[]和char*的区别
APUE p171char good_template[] = "/tmp/dirXXXXXX"; /* right way */char *bad_template = "/tmp/dirXXXXXX"; /* wrong way */For the first template, the name is allocated on the stack, because we use a原创 2017-05-24 22:47:06 · 316 阅读 · 0 评论 -
errno详解
由于errno的重要性,在这里翻译一下Linux中man手册关于errno的内容以及errno涉及的要点注意点1 就像errno的名字一样,它是最后一个错误的编号,因此要小心在查看错误之前又出现了新的错误。注意点2 errno的值不会被任何程序清除,因此在使用errno的值之前,先要通过函数(系统调用/库函数)的返回值来确定有错误发生了。注意点3 下面表格中没有一个常量是0。所以可以事先将原创 2017-05-18 22:42:39 · 13805 阅读 · 0 评论 -
(void)(&_x == &_y)
#define min(x, y) ({ \const typeof(x) _x = (x); \const typeof(y) -y = (y); \(void) (&_x == &_y); \_x < _y ? _x : _y; })这段代码是在阅读《Linux设备驱动开发详解》的时候看到的,自己查阅相关资料对其中几个点做一...原创 2018-03-16 14:47:27 · 951 阅读 · 0 评论 -
typedef和define之间的差别
执行阶段不同 typedef在编译阶段,所以有作用域。define是宏定义,就是无脑替换,所以尽量少用。作用不同 typedef给已有变量起别名。可以用来简化复杂的类型声明,如与struct结合;可以用来定义与平台无关的类型如size_t。define只是无脑替换,基本没啥用。typedef使用的时的注意点。 1.牢记typedef是定义了一种类型的新别名,不是简单的替换。(其实可以带着括原创 2016-11-08 10:02:38 · 404 阅读 · 0 评论