今天我们来学习一下动态内存函数,对内存进行准确的开辟和应用
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、malloc和free
1、malloc
double * ptd;
ptd = (double * ) malloc (30 * sizeof(double));
在ANSIC中,为了程序清晰应对指针进行类型指派,但将void 指针值赋值给其他类型的指针并不构成类型冲突。
如果malloc()找不到所需的空间,它将返回空指针。
我们使用malloc()来创建一个 数组。可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。
malloc可以申请0字节空间吗:
1. 调用多次 malloc(0) 函数,返回值并不会是同一个地址空间,在上述开发环境中,相差32位的地址;
2. 此地址所指向的内存空间上的值全是0;
2、free
在编译程序时,静态变量的数量是固定的:在程序运行时也不改变。
自动变量使用的内存数量在程序执行时自动增加或者减少。
但被分配的内存所使用内存数量只会增加,除非使用free()。
二、realloc和calloc
1、realoc
注意事项
- 检查返回值:总是检查 realloc() 的返回值。如果返回 NULL,不要直接丢弃原有指针。
- 内存泄漏:如果 realloc() 返回 NULL,原来的内存块不会释放。此时应释放原有内存并处理错误情况。
- 指针失效:如果你直接使用原指针来接收 realloc() 返回的新指针,可能会导致内存泄漏,尤其是在 realloc() 失败时。因此,通常先用临时指针接收返回值。
常见用途
- 动态扩展数组或其他数据结构的大小。
- 用于在运行时处理可变大小的数据集,如处理动态生成的列表、字符串或缓存等。
代码如下(示例):
int main()
{
int* p = (int*)malloc(10*sizeof(int));
if (p == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
printf("%d ", *(p + i));
}
printf("\n");
int* p2 = (int*)realloc(p, 20 * sizeof(int));
if (p2 == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
int i = 0;
for (i = 0; i < 20; i++)
{
*(p2 + i)=i;
printf("%d ", *(p2 + i));
}
}
free(p);
p = NULL;
return 0;
}
2、calloc
这个函数在创建时会将创建的空间里面的内容初始化为零(然而要注意,在某些硬件系统中,浮点值0不是用全部位为0来表示的)。
代码如下(示例):
long * newmen;
newmen = (long *) calloc (100, sizeof( long));
在这里,long使用4个字节,因此这一指令建立了100个4字节单元,总共使用400个字节来存储。
使用 sizeof(long)而不是 4 使代码更具可易移植性。
与 malloc()类似,calloc()在ANSI以前的版本中返回一个 char 指针,在ANSI中返回一个void指针。
演示:
int main(){
int *p=calloc(10,sizeof(int));
if(p==NULL){
printf("%s\n",strerror(errno));
}else{
int i=0;
for(i=0;i<10;i++){
printf("%d ",*(p+i));
}
}
free(p);
p=NULL;
return 0;
}
如果要存储不同类型,应该使用类型指派运算符。
这个新函数接受两个参数,都应是无符号的整数(在ANSI中是size_t类型)。
第一个参数是所需内存单元的数量,第二个参数是每个单元以字节计的大小。
它可在其他系统中运行,这些系统中 long不是4字节而是别的大小。
总结
ok,关于动态内存函数的分享到这里就结束啦,有不足的地方欢迎大家指出,我会虚心接受的,另外有兴趣的可以在这个
cplusplus.com - The C++ Resources Network
上面寻找更多有用的东西