相关书籍
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;
}
文件操作