扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在程序中使用free释放,否则该段内存不会被释放掉。
成都创新互联公司凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、成都做网站、网站设计、外贸营销网站建设、网站优化、软件开发、网站改版等服务,在成都十多年的网站建设设计经验,为成都数千家中小型企业策划设计了网站。
C语言不会释放。所谓动态内存,是由malloc系列函数进行申请的内存,除非在程序中使用free释放,否则该段内存不会被释放掉。
标准库中malloc函数的实现原理。要了解针对malloc的内存存储结构,malloc不像全局变量一样,不是在编译器编译的时候就会分配内存空间,而是在调用到malloc函数时才会分配空间。有时还会中途调用free函数释放空间出来。
扩展资料
free:释放malloc分配的存储空间
malloc用于向系统申请一定数量的内存,如果你的程序一味的申请内存供自己使用,那么系统可分配给其它程序的内存就会减少,到最后无内存可用,最终导致系统运行缓慢,不稳定等问题。显然,这种只索取不奉献的行为是不可取的因此,C语言提供了free函数,用于向系统返还借用的内存。
当忘记使用free释放由malloc分配的内存时,表明程序存在”内存泄露“这一顽疾,因此对于上面的程序,在return 0之前,使用下面的代码进行完善。
参考资料来源:百度百科—c语言
你的问题是刚刚学习指针的人都有的问题,需要从地址来认识这个问题,C语言的数据都是需要申请空间来存放的,有静态和动态两种,动态分配的空间大小可以按需要分配,并且可以回收,静态是不可以回收的。
首先,分配动态的空间,指针P和空间的首地址是没有直接的联系的,只是为了手续要使用这个刚刚分配的空间才让P指针指向这个刚刚分配的空间的首地址的话,如果还不理解,你可以反向想想如果你分配的这个空间,而不用P指针指向这个首地址,那么你如何使用这个空间呢?
void型是针对地址型的直接分配,为什么不是分配char的空间呢?因为C语言和硬件关系密切,
有写硬件他的地址不是8位存储的,是16位,或者是32位的,那么这个void就忽略了这个硬件地址宽位就分配100个地址就是了,然后,强制转换成char的8位,如果硬件是16位了,那么,每个地址就会多分配了8位,而使用前8为来存储空间了。
返回的指针是分配的100个地址的首地址,不是这个指针P,举个例子吧,空间可以看做是一个队伍,他本身就有一个领头的人,那么P就是一个单独的人,那么,我们如果像要找到这个队伍,需要先找到队伍的领头人,领头的人只在你申请的时候出现一次,后面,你就找不到他了,怎么办?你把他电话给P吧,P可以找到他。呵呵。
如果还是不理解,那就不要理解了,建议去吧队列的方式,用指针和动态分配内存的方式实现一次,就知道了,不能照着书本抄,全部代码要自己写出来,就肯定理解了。
是的需要用malloc函数分配空间
例如:
先申请100个STUD大小的空间int n=100; STUD* stud=(STUD*)malloc(sizeof(STUD)*n);
再定义一个 i 来记录从文本中读取STUD的次数
如果 i 超过了 100 令 n=n*2,再申请n个STUD空间,把之前的空间用memcpy拷贝到新的空间
函数原型:
void*
malloc(int
size);
参数:size
需要分配的内存大小。
返回值:申请到的内存地址(void*)。
说明:
如果返回NULL则说明申请失败。
1 定义指针。
2 使用malloc函数分配内存。
3 对数组进行访问即可。
对于一维动态数组,直接定义一维指针,并分配内存空间即可。
比如int类型的10个元素动态数组,写作
int *a;
a = (int *)malloc(sizeof(int) * 10);
如果是多维数组,需要从高维向低维逐层分配。如二维数组10*100空间。
int **a;
int i;
a = (int **) malloc(sizeof(int *) * 10); // 先分配10个int*的空间。
for(i = 0; i 100; i ++)
a[i] = (int *)malloc(sizeof(int) * 100); // 对于每个int*,分配100个元素的空间。
这个是可以的,但是和其他网友说的一样,内存是线性的,当你在语言中分配一个多维数组的时候,编译器其实也是分配线性内存的,但是我们可以通过模拟来实现类似数组的操作,下面演示一个分配以及操作数组的实例(列数要固定,这里假设列数为4):
int _tmain(int argc, _TCHAR* argv[])
{
int (*p)[4] = (int (*)[4])0;
int row = 3;
int (*mem)[4] = (int (*)[4])0; // 定义数组首指针
mem = (int (*)[4])malloc(sizeof(int(*)[4]) * row); // 分配row行, 4列的数组
// 分别为二维数组的第一维各个元素赋值。
mem[0][0] = 1;
mem[0][1] = 2;
mem[0][2] = 3;
mem[0][3] = 4;
// 打印二维数组的各个元素的值
printf("%d, %d, %d, %d", mem[0][0], mem[0][1], mem[0][2], mem[0][3]);
free(mem);
return 0;
}
不过这里列数必须指定,还有一种方法,这种方法可以保证用户输入任意行或列,而不必要将列数定死,演示如下:
int getElement(int* arr, int colNum, int row, int col);
void setElement(int* arr, int colNum, int row, int col, int val);
int _tmain(int argc, _TCHAR* argv[])
{
int *arr = (int*)0;
int row = 3;
int col = 5;
//分配 row 行 col 列的整形数组
arr = (int*)malloc(sizeof(int) * col * row);
// 将最后一个元素值设置为100
setElement(arr, col, 2, 4, 100);
//输出最后一个元素的值
printf("%d", getElement(arr, col, 2, 4));
free(arr);
return 0;
}
//各个参数说明如下:
//arr: 数组首地址
//colNum:数组列数
//row: 要取得的元素所在行
//col: 要取得的元素所在列
int getElement(int* arr, int colNum, int row, int col)
{
return *(arr + sizeof(int) * (row - 1) * colNum + col);
}
// 此函数用来设置指定行和列的元素的值:
//arr: 数组首地址
//colNum:数组列数
//row: 要取得的元素所在行
//col: 要取得的元素所在列
//val: 要设置的值
void setElement(int* arr, int colNum, int row, int col, int val)
{
*(arr + sizeof(int) * (row - 1) * colNum + col) = val;
}
其实归根到底,还是对指针的操作,希望可以帮到你,呵呵。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流