C语言
文章平均质量分 66
学习C
bugcoder-9905
长期更新学习笔记
展开
-
空结构体有多大?
构造时需要有一个this指针指向对象的地址,如果对象大小为0,就无法让this指针指向,所以空对象的大小为最小的内存单位1个字节。如果说有更小的类型能表示一个bit,那空对象也可以是1bit。在C语言中struct叫结构体变量,只需要内存即可,所以大小可以为0。原创 2022-10-13 01:09:14 · 421 阅读 · 0 评论 -
C函数调用约定和返回值
文章目录一、函数调用约定1. 影响函数生成的符号名2. 影响形参内存的释放者_stdcall_fastcall_thiscall二、函数的返回值1. 0 < 返回值 <= 4字节3. 4字节 < 返回值 <= 8字节3. 返回值 > 8字节一、函数调用约定_cdecl:C调用约定_stdcall:Windows标准的调用约定_fastcall:快速调用约定_thiscall:C++的成员函数调用约定以上的函数调用约定入参都是从右向左,只有PASCAL从左向右函数调原创 2022-04-26 21:32:06 · 1799 阅读 · 0 评论 -
C函数栈帧开辟以及回退过程
#include <stdio.h>int sum(int a, int b) { int temp = 0; temp = a + b; return temp;}int main() { int a = 10; int b = 20; int ret = 0; ret = sum(a, b); printf("ret = %d\n", ret); return 0;}栈帧开辟以及回退过程从执行main函数转移至sum函数执行,中间发生了什么事情sum原创 2022-04-26 16:54:52 · 879 阅读 · 0 评论 -
理解C指针和数组名
一、理解一维数组二、理解二维数组三、关于指针的题目原创 2022-03-22 20:59:02 · 609 阅读 · 0 评论 -
详细解析编译链接原理(下篇)
一、编译阶段1. 符号解析2. 编译阶段不分配地址二、链接1. 简单的链接方式2. 真实的链接方式3. 符号重定位三、可执行文件格式四、可执行文件装载到内存五、总结原创 2022-03-15 21:09:41 · 694 阅读 · 1 评论 -
详细解析编译链接原理(上篇)
一、引入虚拟地址空间二、虚拟地址空间三、编译链接过程1. 预编译2. 编译3. 汇编4. 链接四、解析ELF文件1. 查看ELF文件头2. 查看段表3. ELF文件不存储.bss段,最后如何给.bss段分配虚拟地址空间?4. 关于强弱符号5. global弱符号链接前暂时记录在\*COM* 块原创 2022-03-15 11:16:25 · 1484 阅读 · 0 评论 -
C语言的前置++和后置++
一、逗号表达式二、后置++三、前置++四、几个表达式1. a+++++b2. ++a+++b3. (++a)+++b原创 2022-03-14 18:03:17 · 4655 阅读 · 2 评论 -
C/C++错题以及零碎知识点记录
联合体union的所有成员都是从该union首地址开始存放的x&(x-1) 可用于把二进制形式的最低位的1置为064位系统有64根地址总线,指针类型都是8字节64位系统有64根地址总线,指针类型都是8字节int* a, b;int* c;int* d;预处理: 处理#开头的预处理指令,就是简单的文本替换编译: 就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编文件...原创 2021-09-20 21:02:42 · 1398 阅读 · 0 评论 -
虚拟地址空间和函数调用过程
编译: 生成可重定位.o文件链接: 多文件链接,符号汇总查看符号表命令: objdump -t内存空间分配编译的时候生成汇编码,链接的时候强符号覆盖弱符号函数调用过程:参数入参函数栈帧开辟返回值返回栈帧回退参数清除参数入参int fun(int a, int b) { int c = a + b; return c;}int main() { int a = 10; int b = 20; int c = 0; c = fun(a, b); retu原创 2021-06-26 16:42:08 · 544 阅读 · 0 评论 -
C语言的预处理
include 把文件当作文本的方式,拷贝到目标文件原创 2021-06-25 16:10:27 · 114 阅读 · 1 评论 -
函数指针笔记
int main() { int arr1[10] = {0}; int(*p1)[10] = &arr1;// p1存放的是数组的地址,该数组有10个int空间 int* arr2[10] = {nullptr}; // p2存放的是int指针 for (int i = 0; i < 10; i++) { (*p1)[i] = i * 10; } for (int num : (*p1)) { printf("%d\n", num); } int* (*p2)[1原创 2021-06-17 09:51:26 · 112 阅读 · 0 评论 -
C动态内存管理
#include<stdio.h>#include<stdlib.h>// #include<vld.h>// 开辟堆区内存:malloc、calloc、realloc// 释放:free,不释放则会内存泄漏// 泄露内存被回收的时候:进程退出时、系统重启/* void* malloc(size_t size); void* 指的是通用地址,只知道地址在哪,而不知道该地址存放什么数据 void* calloc(size_t n..原创 2021-06-10 11:29:58 · 176 阅读 · 2 评论 -
柔性数组笔记
注意:计算sizeof(结构体)的时候,并不计算柔性数组的占用的空间,但柔性数组存放的数据和结构体其他成员相邻结构体里的柔性数组并不是一个指针,而是 一个标志// 不允许char str[];// 允许,因为形参arr最终是一个指针类型void fun(int arr[]){}int main() { // 不允许 int arr[0]; return 0;}定长结构体柔性数组的使用struct buffer { int num; i.原创 2021-06-10 10:43:27 · 209 阅读 · 0 评论 -
联合体union
union data { short st; char cs[2];};int main() { union data x = {}; x.st = 0x0001; if (x.cs[1] == 0) { // 高地址存放高位 printf("小端\n"); } else { printf("大端\n"); } return 0;}union data { char ch;.原创 2021-06-08 10:56:40 · 289 阅读 · 0 评论 -
C语言结构体内存对齐
struct xx { long long a; char b; int c; char d[2]; static int e;};int main(){ struct xx x; printf("%ld\n", sizeof(x.a)); //8 printf("%ld\n", sizeof(x.b)); //1 + 3 printf("%ld\n", sizeof(x.c)); //4原创 2021-05-31 16:10:28 · 286 阅读 · 2 评论