C语言动态分配内存
动态增加内存空间 可以用 realloc 函数。函数原型是。
void* realloc (void* ptr, size_t size);
例如,你第一次用 malloc 函数 动态分配了空间,随着一步步运算,觉得空间不够,需要加大空间,与此同时,原先空间里的数据需保留并还要继续使用,这时需要用 realloc,它能满足此需要。
下面是完整的程序例子。告诉使用 realloc 的窍门。
#include /* printf, scanf, puts */
#include /* realloc, free, exit, NULL */
int main ()
{
int input,n;
int count = 0;
int* numbers = NULL;
int* more_numbers = NULL;
do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;
more_numbers = (int*) realloc (numbers, count * sizeof(int));
if (more_numbers!=NULL) {
numbers=more_numbers;
numbers[count-1]=input;
}
else {
free (numbers);
puts ("Error (re)allocating memory");
exit (1);
}
} while (input!=0);
printf ("Numbers entered: ");
for (n=0;n<count;n++) printf ("%d ",numbers[n]);
free (numbers);
return 0;
}
就是当你的程序中使用数组或者是指针变量的时候,为了能够合理地利用内存空间来进行程序运行,自动开辟内存在栈区,最后用完这些内存再将其回收的方式。动态内存分配不像静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要来分配,分配大小就是程序要求大小。
一般在C语言中使用malloc和free方法
头文件为malloc.h或者是stdlib.h,
1、malloc函数
malloc函数的原型为:
void *malloc (u igned int size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
下例是一个动态分配的程序:
#include
#include
main()
{
int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
if((array(int *) malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存储空间。");
exit(1);
}
for (count=0;count〈10;count++) /*给数组赋值*/
array[count]=count;
for(count=0;count〈10;count++) /*打印数组元素*/
printf("%2d",array[count]);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
2、free函数
由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
其函数原型是:
void free(void *p)
作用是释放指针p所指向的内存区。
其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2) /*或者free(p2)*/
malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。
malloc函数是对存储区域进行分配的。
free函数是释放已经不用的内存区域的。
所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。
p1=(int
*)malloc(10*sizeof(int));就是生成了一个动态数组啊
而且C语言里p[x]实际上就等价于*(p+x),只要p是指针类型的变量,不管它是数组,还是其他什么,都不会报错
关于c语言 动态内存分配的问题
(3)fscanf 返回值等于成功读入的参数个数。用 feof() 判断文件结束 while( fscanf(inFile,"%c",number[i]) ==1){ if (feof(inFile)) break; ...} while( fscanf(inFile,"%d",original+j ) ==1){ if (feof(inFile)) break; ...} (4)动态分配要用到 sizeof(类型) * 个数:o...
c语言内存有几种分配方式?
动态分配 还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆操作函数是malloc、calloc、realloc和free。使用堆(Heap)内存将带来额外的开销和风险。
c语言如何使用动态分配内存的方法定义指针,并且可以用sizeof计算出数组...
内存动态分配时必须确定大小,既然大小已确定,还要sizeof(a);有何意义?再者sizeof操作符计算的是()中的变量或类型所占有的内存数,a就是个指针,一般是4字节,所以sizeof(a)的值是4而不是malloc分配成功的那么多字节。这里有个概念要弄清楚了就不会有纠结了,那就是a=(int *)malloc();这样的...
c语言,动态内存分配,判断,释放问题
判断分配是否成功:malloc返回0则分配失败,否则分配成功。释放一个指针p指向的内存空间的方式:free(p); p=NULL;不是
关于c语言动态内存分配的问题
C语言有个可移植性的关键字,叫sizeof,它检测的是一个类型的数值所占据空间的大小,大小的度量单位是字节,一个int占据空间的大小=sizeof(int),一个双精度实数占据空间的大小=sizeof(double)。如果要动态分配10个int数值的内存空间,则该内存空间的大小=10*sizeof(int)。相信你懂的哈。这块空间的...
C语言动态分配内存问题(一段内存中存储int,char*等)
首先你这样固定内存地址指向你要存储的值,可能会引起错误,因为其他程序可能正在用此内存空间,windows有比较好的内存管理机制,产生内存冲突时会提示,XXXX程序错误,,内存0x 010010101010不能为read 等等诸如此类的提示。你想动态的申请一块内存只需要一个函数自动为你分配就好,你查查函数mem()的算法。
关于C语言动态分配内存,为什么会发生错误??
如果要在子函数中修改p的值,必须把p的指针传过去,也就是说,这里必须是二级指针。include<malloc.h> typedef struct { float x,y;}point;void build_pol(point **p,int n){ int i;float x,y;p=(point *)malloc(n*sizeof(point));for(i=0;i<n;i++){ scanf("%f %f",&x,&y);...
...从内存中分配存储 n个双精度实数的存储空间(动态?
以下是一个使用C语言动态数组实现的程序,用于读取指定数量的双精度实数(从文件data.txt中),并计算它们的平均值:```c include <stdio.h> include <stdlib.h> \/\/ 包含动态分配内存的函数 int main() { int n;double *arr; \/\/ 定义一个指向双精度动态数组的指针 double sum = 0, avg;\/\/...
C语言为数组动态分配内存并赋值,为什么第一种方法正确,第二种方法错...
a=(int *)malloc(sizeof(int)); \/\/这个返回的东西只能放一个 int。 多次malloc 返回的地址是不保证连续的,每次的返回都只能容纳一个int。a[i]=i; 访问后面的第i个元素,但后面其实是没有东西的,非法访问来的。 如下图,红色的表示没有实际的东西,非法访问 ...
C语言中如何动态增加内存空间
动态增加内存空间 可以用 realloc 函数。函数原型是。void* realloc (void* ptr, size_t size);例如,你第一次用 malloc 函数 动态分配了空间,随着一步步运算,觉得空间不够,需要加大空间,与此同时,原先空间里的数据需保留并还要继续使用,这时需要用 realloc,它能满足此需要。下面是完整的程序...
夏蒋木香: 数组定义:int *f; 分配内存:f=malloc(n*sizeof(int));//n是数组长度 赋值:for(i=0;i<=n-1;i++)cin>>f[i]; 重新分配内存:f=realloc(f,m*sizeof(int));//m是新的数组长度
沧县13072188823: C语言:动态内存分配 - ?
夏蒋木香: 1.p1=(int *)malloc(10*sizeof(int)); //malloc 函数将会在动态存储区中分配一个长度为 10*sizeof(int)的 <连续> 空间. 而且p1的值是 分配域的起始地址;这就有一点像数组名了.2.例如 int temp[10]; int *ptemp; ptemp=temp; //得到数组的首地址.这样 ptemp 就可以 引用 数组的元素了.比如 ptemp[i]; 当然 这是 固定分配内存的.3.scanf("%d",&p1[btc]); 和 printf("%d",p1[btc]); 这两个函数 中 p1 的作用 就 是相当于数组名. 引用动态的数组.
沧县13072188823: C语言的动态存储分配 - ?
夏蒋木香: p=(int*)malloc(sizeof(int));分配可以存储一个int类型量的空间,将空间首地址保存到p中.动态分配的空间在程序运行的过程中必须通过free()函数释放,否则会一直占用.看书去吧,这些知识光靠在这里问,不系统地看书学习是不可能掌握的.************************************************* malloc()和calloc()都是用于动态分配连续存储空间的,区别是calloc()会将分配的空间用0初始化,malloc()不进行初始化realloc()函数用于修改用上述两个函数分配的空间大小.free()用于释放上述函数分配的空间.
沧县13072188823: 如何用C语言编写动态分配内存的函数 - ?
夏蒋木香: #include <stdio.h>void main() {int *p;p=new int;*p=3;printf("%d\n",*p);delete p; }
沧县13072188823: c语言中什么是动态分配内存? - ?
夏蒋木香: c语言用函数malloc动态分配内存的,要用到指针,释放内存是free指针 malloc 原型:extern void *malloc(unsigned int num_bytes); 用法:#include <malloc.h> 或#include<stdlib.h> 功能:用于向内存申请空间,分配长度为num_bytes字节的内存...
沧县13072188823: C语言中的动态内存分配的用法举例 - ?
夏蒋木香: 1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间.其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针. 2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且...
沧县13072188823: C语言中动态分配内存问题 - ?
夏蒋木香: #include void px(int *k,int len);//函数声明 int main() {int i,n,x,*p,*q;printf("请输入动态数组长度n\n");scanf("%d",&n);printf("请输入%d个数组元素\n",n);q = p = (int*)malloc(n*sizeof(int));//申请动态数组for(i=0; i {...
沧县13072188823: C语言中分配内存 - ?
夏蒋木香: 要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数 1、malloc函数 malloc函数的原型为:void *malloc (u igned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间.其参数是一个无符号整形数,返...
沧县13072188823: c语言程序怎么实现动态内存分配? - ?
夏蒋木香: 一、原型:extern void *malloc(unsigned int num_bytes); 头文件:#include功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL.当内存不再使用时,应使用free()函数将内存...
沧县13072188823: 关于c语言动态内存分配的问题! - ?
夏蒋木香: 要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数.(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)1.malloc函数 函数原型为void *malloc(unsigned int size);在内存的动态存储...