C基本知识
1 C基本数据类型
C基本的数据类型说明:

2 字节序

测试代码:
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len)
{
int i;
for (i = 0; i < len; i++) {
printf(" %.2x", start[i]);
}
printf("\n");
}
int main(void)
{
int x = 0x01234567;
show_bytes((byte_pointer)&x, sizeof(x));
return 0;
}
编译运行测试:
$ gcc endian.c
$ ./a.out
67 45 23 01
可以看出,当前我运行的机器是小端序。
3 结构体
参考:C语言技术天花板【结构体】一节课掌握_哔哩哔哩_bilibili
结构体中成员排列的规则:
结构体成员的内部偏移量(内部地址),要被这个成员的数据类型的大小整除。
struct test {
int a; /* [Byte][Byte][Byte][Byte] */
char c; /* [Byte][0x00] */
short s; /* [Byte][Byte] */
};
/* 结构体的内存大小 */
sizeof(struct test) = 8; /* 结构体中的内存分布,可看出成员c后面填充了1Byte的0x00 */
struct test test1 = {0};
test1.a = 0x12345678;
test1.c = 0xbb;
test1.s = 0xccdd; (gdb) x /8bx &test1
0x7fffffffe110: 0x78 0x56 0x34 0x12 0xbb 0x00 0xdd 0xcc
整个结构体的大小,必须是最大成员的size的整数倍,否则就需要在末尾填充空白字节。
struct test {
int a; /* [Byte][Byte][Byte][Byte] */
char c; /* [Byte] */
};
/* 结构体的内存大小 */
sizeof(struct test) = 8; /* 结构体中的内存分布,可看出成员c后面填充了3Byte的0x00 */
(gdb) x /8bx &test1
0x7fffffffe110: 0x78 0x56 0x34 0x12 0xbb 0x00 0x00 0x00
对于结构体中的结构体,按照结构体展开之后的内存对齐来处理。
struct test1 {
int a; /* [Byte][Byte][Byte][Byte] */
short s; /* [Byte][Byte][0x00][0x00] */
}; struct test {
int a; /* [Byte][Byte][Byte][Byte] */
char c; /* [Byte][0x00][0x00][0x00]*/
struct test1 s;
};
/* 结构体的内存大小为16,根据规则1,成员c后面补充3Bytes的0x0,根据规则2,s.s成员后面补充2Bytes的0x0 */
sizeof(struct test) = 16; /* 结构体中的内存分布 */
struct test test1 = {0};
test1.a = 0x12345678;
test1.c = 0xff;
test1.s.a = 0xaabbccdd;
test1.s.s = 0x9988;
(gdb) x /16bx &test1
0x7fffffffe100: 0x78 0x56 0x34 0x12 0xff 0x00 0x00 0x00
0x7fffffffe108: 0xdd 0xcc 0xbb 0xaa 0x88 0x99 0x00 0x00
认为指定特殊的对齐规则,使用
#pragma pack(n)指定每个成员的其实地址,按照n来对齐,覆盖第一条规则。如果整个n比第一条规则对齐还要大,那么就取小的。#pragma pack(2)
struct test1 {
int a; /* [Byte][Byte][Byte][Byte] */
short s; /* [Byte][Byte] */
}; struct test {
int a; /* [Byte][Byte][Byte][Byte] */
char c; /* [Byte][0x00] */
struct test1 s;
};
/* 结构体的内存大小为12,根据规则4,成员c后面补充1Bytes的0x0 */
sizeof(struct test) = 12; /* 结构体中的内存分布 */
struct test test1 = {0};
test1.a = 0x12345678;
test1.c = 0xff;
test1.s.a = 0xaabbccdd;
test1.s.s = 0x9988;
(gdb) x /12bx &test1
0x7fffffffe110: 0x78 0x56 0x34 0x12 0xff 0x00 0xdd 0xcc
0x7fffffffe118: 0xbb 0xaa 0x88 0x99
#pragma pack(8)
struct test1 {
int a; /* [Byte][Byte][Byte][Byte] */
short s; /* [Byte][Byte] */
}; struct test {
int a; /* [Byte][Byte][Byte][Byte] */
char c; /* [Byte][0x00] */
struct test1 s;
}; /* 规则1生效 */
sizeof(struct test) = 16;
不使用任何对齐,直接存放数据的方式,使用
#pragma pack(1)。#pragma pack(1)
struct test1 {
int a; /* [Byte][Byte][Byte][Byte] */
short s; /* [Byte][Byte] */
}; struct test {
int a; /* [Byte][Byte][Byte][Byte] */
char c; /* [Byte] */
struct test1 s;
};
/* 结构体的内存大小为11,各个成员之间不会填充0x0 */
sizeof(struct test) = 11; /* 结构体中的内存分布 */
struct test test1 = {0};
test1.a = 0x12345678;
test1.c = 0xff;
test1.s.a = 0xaabbccdd;
test1.s.s = 0x9988;
(gdb) x /11bx &test1
0x7fffffffe110: 0x78 0x56 0x34 0x12 0xff 0xdd 0xcc 0xbb
0x7fffffffe118: 0xaa 0x88 0x99
C基本知识的更多相关文章
- 你必须知道的EF知识和经验
注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 学点HTTP知识
不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- [.NET] C# 知识回顾 - 事件入门
C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...
随机推荐
- 哨兵的多个核心底层原理的深入解析(包含slave选举算法)
一.sdown和odown转换机制sdown和odown两种失败状态 sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机odown是客观宕机,如果quorum数量的哨 ...
- HashMap面试必问的数据结构相关知识总结
1:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树.transient Node<K,V>[] t ...
- 【SQL】IN和EXISTS谁的效率更高
[SQL]IN和EXISTS谁的效率更高 总结: 索引设置好的情况下 子查询数据量大的,用exists 子查询数据量小的,用in 原文连接:https://zhuanlan.zhihu.com/p/4 ...
- Oracle 一些触发器自治事务相关错误
Oracle 一些触发器自治事务相关错误 table XXX is mutating,trigger/function may not see it 在触发器中调用的函数或者语句有查询当前表的操作,比 ...
- 力扣557(java)-反转字符串中的单词(简单)
题目: 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入:s = "Let's take LeetCode contest&qu ...
- 斩获大奖|阿里云PolarDB-X引领云原生分布式数据库新时代
简介:阿里云原生分布式数据库PolarDB-X荣获"2021年度最佳分布式数据库". 12月15-16日,以"引领分布式云变革 助力湾区数字经济"为主题的全球分 ...
- IIncrementalGenerator 判断程序集的引用关系
本文将告诉大家如何在 IIncrementalGenerator 增量 Source Generator 生成代码里面,在 Roslyn 分析器里面判断两个程序集是否存在引用关系 先上核心代码实现,核 ...
- 使用 Data Assistant 快速创建测试数据集
使用 Data Assistant 快速创建测试数据集 Data Assistant 提供超过 100 种数据类型,为任何开发.测试或演示目的生成大量.异构.真实的数据. 官网地址:http://ww ...
- 鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)
前言 键鼠事件是指在计算机操作中,用户通过键盘和鼠标来与计算机进行交互的行为.常见的键鼠事件包括按下键盘上的键.移动鼠标.点击鼠标左键或右键等等.键鼠事件可以触发许多不同的操作,比如在文本编辑器中输入 ...
- Git实战技巧:恢复被强制push -f失踪的代码
前言 Git是一个易学难精的分布式版本控制系统,被我们码农常用于代码的管理.如果你还不了解Git,建议先通过廖雪峰的Git教程进行了解,再来看本文,因为本文以使用技巧为主,不会在基础名词上做过多解释. ...