C语言笔记
Thornger
明天是未知数,所以,希望在今天
展开
-
数据和结构体强转个人理解
struct Heard{ char name[2]; int age; char sex;}定义一个接头体如上char buffer[12] = {'a','b','c','d','e','f','g','h','i','j','\0'}定义一个char 数组buffer初始化struct Heard myheard;struct Heard *pheard;p =原创 2015-05-21 18:02:00 · 559 阅读 · 0 评论 -
Buffer Overflow之argv
在linux 编程中,我们会遇到这种情况:int main(int argc, char *argv[]) { /* ... */ }参数从命令行中读取到程序的内存中,程序启动的时候调用main函数,命令行保存在argv[0]~argv[argc-1]中,按照惯例,argv[0]表示程序的名称,从argv[1]开始到argv[argc-1]表示程序的参数。因为argv的参数的大小我们无法控制...翻译 2019-05-07 17:43:36 · 273 阅读 · 0 评论 -
整型转换规则及注意事项
不合法操作下面的例子中介绍,当使用比int小的类型上使用位操作符时,容易出现的问题。这个例子中,代码的本意是先对port取反,然后向右移动四位。如果这两个操作符都作用在8字节的unsigned integer上时,最终的结果将会是0x0a,但是,操作过程中,port首先会升级为signed int类型,然后可能会产生下面图表中的结果。uint8_t port = 0x5a;uint8_t ...翻译 2019-05-08 15:15:31 · 2197 阅读 · 0 评论 -
errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in /tmp/ccJmra7
现象原因解决方案现象在编写strerror输出错误信息的时候有时候会遇到一下或者类似的情况errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in /tmp/ccJmra71.o原因可能是因为你复制的网上的代码,或者使用了以下代码extern int errno;解决方案将上面代原创 2017-03-22 14:19:56 · 4126 阅读 · 0 评论 -
__BUILTIN_TYPES_COMPATIBLE_P函数
__BUILTIN_TYPES_COMPATIBLE_P翻译 2017-03-20 17:42:27 · 3206 阅读 · 0 评论 -
求最右边的第一个1的数组
求一个字节(8位)表示的数字中查找最右边第一个非0的数字的位置,该数组如何解析呢?static const uint8 rightmost_one_pos[256] = { 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0,原创 2017-03-03 09:24:48 · 441 阅读 · 0 评论 -
位移实现取下整
在postgresql中有如下定义:(引用于postgresql内核) 表示对ALIGNVAL取整,ALIGNVAL为2的幂。#define TYPEALIGN_DOWN(ALIGNVAL,LEN) \ (((uintptr_t) (LEN)) & ~((uintptr_t) ((ALIGNVAL) - 1)))ALIGNVAL为2的幂,2,4,8等。 本文以4为例子做解释:看宏:原创 2017-02-13 12:17:24 · 478 阅读 · 0 评论 -
位移实现取模运算
在程序中遇到一个取模运算,列出来让大家共享。 取模的前提是取模值必须为2的幂。文章以取8的模为例:ATT表示任意非负两个字节整形(ATT) & 0x07)经过上面的运算就取得了最后3个字节X X X X X X X X0 0 0 0 0 1 1 1---------------0 0 0 0 0 X X X对于负数,笔者没有做过多的计算,可能存在失误,读者可以自己运算一下。原创 2017-01-12 14:26:56 · 3940 阅读 · 1 评论 -
白话字符编码和字符集
下面解释是使用白话解释。专业属于请参考其他文档 字符 字符代表的是一个字,如:一个英文’A’或者中文’王’ 字符集 字符集表示字符的集合,表示这个集合可以包含的字符的范围。 如:ascii 无法保存汉字,因为它范围不够。 字符编码 字符集的计算机表示形式,表示这个字符集合如何在计算机中表示。 如:一些编码设置2个字节代表一个字符,有些是用1个字节表示一个字符。字符编码指定了你用几个字原创 2016-11-23 11:11:51 · 515 阅读 · 0 评论 -
C语言中位移问题
声明: 本文非原创,转自其他人博客,有个错字,进行修复一下,本人特别讨厌各种复制粘贴,本篇文章只作为自己参考使用,如有侵权,请原作联系本人。博客链接逻辑位移与算数位移 http://www.cnblogs.com/hnrainll/archive/2011/07/06/2099068.html正文 在C语言中,涉及位移的运算符有2个,>>表示右移,<<则表示左移。 而汇编指令中,SHL原创 2016-07-22 14:41:31 · 1232 阅读 · 0 评论 -
结构体强转联合体笔记
结构体强制转换为联合体笔记 测试代码1int main(){ //首先创建一个联合体,联合体内有两个结构体 typedef union { struct { unsigned int i_ia = 0; char buffer[32] = "a"; } va_4byte;原创 2016-07-11 17:39:02 · 889 阅读 · 0 评论 -
内存溢出之sprintf
sprintf在下面的代码例子中,name可能来自用户输入,文件系统或者网络。程序从字符串构造文件名,为打开文件做准备#include <stdio.h> void func(const char *name) { char filename[128]; sprintf(filename, "%s.txt", name);}因为sprinf函数不保证输入字符...翻译 2019-05-07 18:12:23 · 2833 阅读 · 0 评论