C语言学习笔记

it2025-07-06  12

相关书籍

1、如何产生地址

在32位平台上,会产生32位地址线/数据线,通电会有正(1)、负(0)之分,

也就是会有2的32次方个地址,且每个存储单元的大小是一个字节,也就是最多可以访问4G的内存。

2、指针大小

在32位平台上一个指针大小占4个字节,64位平台占8个字节

3、访问速度

寄存器>高速缓存>内存>硬盘

1、&数组名 数组名不是首元素地址,取出的是整个数组的地址 2、sizeof(arr) sizeof(数组名) 数组名表示的是整个数组 //除此以外在任何地方看到的数组名都是代表首元素的地址

CPU只有加法器

整数在内存中的存储

小端存储模式

函数调用的内存分析

函数栈帧的创建和销毁

结构体内存对齐

20个字节

位段的内存分配

C语言执行流程

动态内存分配 CDemo22

realloc

//笔试题(该题有bug) void GetMemory(char* p) { p = (char*)malloc(100); } void demo01() { char* str = NULL; GetMemory(str); strcpy(str, "hello"); printf("%s\n", str); }

空指针不是有效的地址,没有指向一块有用的空间 解决方案2

柔性数组

//柔性数组 结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。 struct S { int n; int arr[0];//未知大小的-柔性数组成员-数组的大小是可以调整的 }; void demo06() { //struct S s; //printf("%d\n",sizeof s); 4 struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int)); ps->n = 100; int i = 0; for (i=0;i<5;i++) { ps->arr[i] = i;//0 1 2 3 4 } struct S* ptr = realloc(ps, 44); if (ptr != NULL) { ps = ptr; for (i = 5; i < 10; i++) { ps->arr[i] = i; } for (i = 0; i < 10; i++) { printf("%d\n", ps->arr[i]); } } free(ps); ps = NULL; } 这不是柔性数组 struct S2 { int n; int* arr; }; void demo07() { struct S2* ps = (struct S2*)malloc(sizeof(struct S2)); ps->arr = (int*)malloc(5 * sizeof(int)); int i = 0; for (i=0;i<5;i++) { ps->arr[i] = i; } for (i = 0; i < 5; i++) { printf("%d\n", ps->arr[i]); } //调整大小 struct S2* ptr = realloc(ps->arr, 10 * sizeof(int)); if (ptr != NULL) { ps->arr = (int*)ptr; for (i = 5; i < 10; i++) { ps->arr[i] = i; } for (i = 0; i < 10; i++) { printf("%d\n", ps->arr[i]); } } free(ps->arr); free(ps); ps->arr = NULL; ps = NULL; }

文件操作

最新回复(0)