一. 存储区划分(地址由高到低)
栈区
int a = 3;
堆区
malloc(255)
静态区
static float h = 1.36
常来区
"sdk"
代码区
void func(){...}
注意:
栈内存:栈内存返回是不安全的,禁止!!!
常量区:常量占用内存,只读状态,决不可修改!
静态存储区:1.只初始化一次
2.如果初始化没值,默认值0
3.只有程序退出才释放
将变量定义的类型前加static,则该变量存储在静态存储区
堆区:手动分配,手动释放
代码区:所有的语句编译后会生成CPU指令存储在代码区
二.堆内存分配函数
动态内存分配
void *malloc(unsigned int size);
*返回分配完的内存的首地址,size需要分配的字节数,因是参数,可以写成表达式.可以根据需求运行期分配内存.
malloc使用
1. char *str = malloc(8);
strcpy(str, "sdf");使用刚刚分配的内存,存储数据
2. int *arr = malloc(4);
short *sarr = malloc(4);
arr分配一块内存可存放一个int型元素,sarr可存放两个short型元素
3. Student *p = malloc(sizeof(Student));
Student *p = malloc(sizeof(Student)*5);
分配一个结构体内存和分配一个结构体数组的内存
内存释放
void free(void *);
free函数作用是释放内存,内存释放是标记删除.
三.其他内存分配函数
calloc
void * calloc(unsigned n,unsigned size);
分配n个size大小的空间,并且把该内存上的所有字节清零
realloc
void *realloc(void *p, unsigned newSize);
按给定的地址以及给定的大小重新分配
四. 内存操作函数
初始化内存
从s指向的内从开始初始化n个字节的内容为c
void *memset(void *s, int c, size_t n);
内存拷贝
从source指向的内存开始拷⻉贝到dest,拷⻉贝n个字节
void *memcpy(void *dest, const void *source, size_t n);
内存比较
int memcmp(const void *buf1, const void *buf2, unsigned int count);
⽐比较buf1和buf2指向的内存是否相同,⽐比较count个字节
练习代码:
1.输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值。
int main()
{
int x = 0;
scanf("%d", &x);//输入数组长度
//动态分配
int *p = malloc(sizeof(int) * x);
int *head = p;//指向数组的首地址
//生成随机数,保存在数组中
for (int i = 0; i
*p ++ = arc4random() % (40 - 20 + 1) + 20;
}
int max = 0;//用于保存最大值
for (int i = 0; i
//查找最大值
if (max
max = head[i];
}
//输出数组
printf("%d ", head[i]);
}
//输出最大值
printf("\nmax = %d ", max);
//释放空间
free(head);
//指针置空
head = NULL;
p = NULL;
return 0;
}
2.有一段文本,将文本中的所有单词,存放到一个字符串数组中。(要求占用内存最少)
int main()
{
char str[] = "s sdfs sdf af asfadsf ads f asd fa sdf as ddbv";
char tempStr[20] = {0};//暂存单词
char *p[255] = {0};//存储栈区空间地址
int i = 0;//str下标
int j = 0;//tempStr下标
int k = 0;//指针数组下标
while (1) {
//获取一个单词
if (str[i] != ' ' && str[i] != '\0') {
tempStr[j ++] = str[i];
//一个单词结束
} else if (j != 0){
//当遇到空格,或者\0时,单词的存放结束
tempStr[j] = '\0';
p[k] = malloc(strlen(tempStr) + 1);
strcpy(p[k], tempStr);
k ++;
j = 0;//存储下一个单词
}
//while出口,str被遍历完成
if (str[i] == '\0') {
break;
}
i ++;//移动str数组中的下一个元素
}
for (int i = 0; i
printf("%s ", p[i]);
free(p[i]);
p[i] = NULL;
}
return 0;
}