上次笔记C语言的时候笔记到关于C语言的不同数据变量类型的存储方式。包括变量的存储位置,什么时候为其分配内存,未被初始化时的初始,作用域,生存期等话题。并留了一个关于“堆”的动态内存分配问题。趁课余时间聊聊动态内存分配及使用动态内存分配时需要注意的问题。
为什么要动态内存分配
栈空间大小有限
这主要是体现在较大的程序上面。动态局部变量是存储在栈上的,而且栈的空间有限,太大的程序就需要额外的空间来存储变量。这个时候就可以向堆索取动态的内存,即动态内存分配。
申请一个与数据(如某文件)所需内存大小相宜的内存空间,避免空间的浪费,同时避免空间不够。
在不知道数据有多大时,可以用一个较大的下标来定义 一个数组来存储相应的数据,这样一来有可能这个下标不够大,造成数组上越界,也有可能下标过大,造成内存浪费(在相应的程序块结束后才自动释放)。
进行动态分配的对象一般是指针(C语言),可以使用malloc、calloc、realloc函数来申请内存(堆)空间。当然到内存不需要的时刻需要手动使用free函数来释放相应的空间。以免造成内存泄露。
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);v
oid* calloc(size_t nelem, size_t elsize);
三个函数都在stdlib.h函数库
malloc与calloc的区别为1块与n块的区别:malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为"size"字节的连续区域,返回该区域的首地址。calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为"size"字节的连续区域,返回首地址。realloc 不能保证重新分配后的内存空间和原来的内存空间指在同一内存地址, 它返回的指针很可能指向一个新的地址。
用malloc举一简单例子来说明其基本用法:
例malloc_1.c
<span style="">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
int main(void)
{
int i;
char *p;
p = (char*)malloc(N * sizeof(char));
//Note: check return value of malloc funciton
if(p == NULL){
printf("RAM allocate fialed\n");
return 0;
}
//memset(p, 1, N * sizeof(char));
//Look p[] values before initilized
//and see address of everyone
for(i = 0; i < N; i++){
printf("p[%d] no_value:%c\taddress is %p\n", i, p[i], &p[i]);
}
//Release
free(p);
return 0;
}
</span>
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-31017-1.html
赤裸裸千里万里挑衅和侵犯别国做出愚蠢行为是要付出代价的