知识点回顾
1. malloc 可以申请一块任意尺寸的空间
malloc不仅可以申请存储基本数据类型的空间,事实上它还可以申请一块任意尺寸的内存空间。对于后者,由于申请得到的空间的连续的,所以我们经常用数组来进行索引即可:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *ptr = NULL;
int num, i;
printf("请输入待录入整数的个数:");
scanf("%d", &num);
ptr = (int *)malloc(num * sizeof(int));
for (i = 0; i < num; i++)
{
printf("请录入第%d个整数:", i+1);
scanf("%d", &ptr[i]);
}
printf("你录入的整数是:");
for (i = 0; i < num; i++)
{
printf("%d ", ptr[i]);
}
putchar('\n');
free(ptr);
return 0;
}
2. 初始化内存空间
由于malloc并不会帮助你初始化申请的内存空间,所以需要你自己进行初始化。
当然你可以写一个循环来做这件事,但不建议你这么做,因为标准库里提供了更加高效的函数:memset。
3. calloc
calloc函数在内存动态中动态地申请nmemb个长度为size的连续空间(即申请的总空间尺寸为nmemb*size),这些内存空间全部初始化为0.
calloc函数与malloc函数的一个重要区别是:
- calloc函数在申请完内存后,自动初始化该内存空间为零。
- malloc函数不进行初始化操作,里面数据是随机的。
4.realloc
一下几点是需要注意的:
- realloc函数修改ptr指向的内存空间大小为size字节
- 如果新分配的内存空间比原来的大,则旧内存块的数据不会发生改变;如果新的内存空间小于旧的内存空间,则可能会导致数据丢失,慎用!
- 该函数将移动内存空间的数据并返回新的指针
- 如果ptr参数为NULL,那么调用该函数就相当于调用malloc(size)
- 如果size参数为0,并且ptr参数部位NULL,那么调用该函数就相当于调用free(ptr)
- 除非ptr参数为NULL,否则ptr的值必须由先前调用malloc、calloc或realloc函数返回。
知识点回顾
0. 请问调用一次 malloc 函数可以申请多块内存空间吗?
答:不行,调用一次malloc函数智能申请一块连续的内存空间,只是其吃春可以自定义。
1. 以 mem 开头的函数比如 memcpy,memcmp 被编入字符串标准库(函数的声明包含在 string.h),那么请问它们与同在该标注库的 strncpy,strcnmp 函数有什么区别呢?
答:从形式上看,str开头的函数使用的是char类型的指针(char *)作为参数和返回值;而mem开头的函数使用的是void类型的指针(void *)作为参数和返回值。
从本质上看,str开头的函数主要目的是提供字符串的拷贝,比较等操作;而mem开头的函数主要目的是提供一个搞笑的函数接口来处理内存空间的数据。
2. 请用 malloc 函数实现 calloc(1024, sizeof(int)) 函数得到的结果?
答:calloc函数在申请完内存后,自动初始化该内存空间为零,而malloc函数不进行初始化操作,所以调用完malloc函数之后,需要在调用mamset函数将内存初始化为零。
int *ptr = (int *)malloc(1024*sizeof(int));
memset(ptr,0,1024*sizeof(int));
3. realloc(NULL, 1024) 的含义是?
答:申请1024个字节的内存空间,并返回地址,相当于malloc(1024)。
4. 请问下面代码存在什么问题?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
static int *pi = (int *)malloc(sizeof(int));