- 竟然可以手动分配内存!想想还有点小激动。
- 当内存块不再使用时一定要调用 free 函数释放内存
目录
- 内存操作函数(malloc / calloc / realloc / memcpy 等)( 头文件:‘ stdlib.h ’ )
- demo(malloc 函数,简单内存分配)
1. demo(将结构体指针指向一块 ’精心安排的‘ 内存区域,并打印该结构体成员变量)
- malloc 函数可以保证其返回的内存是地址对齐的(关于地址对齐),所以它可以被转换为任何类型的指针。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data {
int i;
char msg[13];
};
void main(){
char *da = malloc(20);
char *pda = da;
// 内存块初始化,写内存操作
// 我的机器为:小端字节序,所以 int 类型数据的低序字节写在内存低位
// 首先在前 4 个字节中以小端字节序写入十进制数值:1314,紧接着是字符串‘hello!\0’
*pda++ = 34;
*pda++ = 5;
*pda++ = 0;
*pda++ = 0;
*pda++ = 'h';
*pda++ = 'e';
*pda++ = 'l';
*pda++ = 'l';
*pda++ = 'o';
*pda++ = '!';
*pda = 0; // 字符串结尾
struct data *sd;
sd = (struct data *)da; // 将前面分配的地址赋值给结构体
// 打印结构体中的 字符以及字符串
// 从地址块中,先按小端字节序读取 4 个字节作为成员变量 i 的值,
// 接着继续读取余下的字节直至读到字符串末尾即:空字符 ‘\0’ 为止,作为成员变量 msg 的值,
// 这里并没有什么类型检查之类的,而是按照结构体中成员变量声明的顺序在内存块中读取对应类型长度的字节,
// 其中要注意 字节序问题,以及 C 语言中的字符串以空字符 ‘\0’ 作为结束标志
printf("i: %d, msg: %s\n", sd -> i, sd -> msg);
}
运行结果(达到预期):
ubuntu@cuname:~/dev/beginning-linux-programming/test$ gcc -o test3 test3.c
ubuntu@cuname:~/dev/beginning-linux-programming/test$ ./test3
i: 1314, msg: hello! // 达到效果
- 上面程序代码中的字节序问题说明(使用 win 10 自带的计算器在 十进制 和 二进制 之间进行转换)