当前位置:首页>开发>正文

c 动态内存管理 关于C语言动态分配内存的问题

2023-04-11 21:12:15 互联网 未知 开发

c   动态内存管理 关于C语言动态分配内存的问题

关于C语言动态分配内存的问题

要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)
  1.malloc函数
  函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100) 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。
  2.calloc 函数
  函数原型为void *calloc(unsigned int num, unsigned int size)
  按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为 num*size。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)) 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
  3. realloc函数:
  函数原型为void *realloc(void *ptr, unsigned int size)
  重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地 址(该地址可能与以前的地址不同)。例如p1=(float *)realloc(p1,16)将原先开辟的8个字节调整为16个字节。
  **动态申请的内存空间要进行手动用free()函数释放

  例子:

  char *p
  p=(char*)malloc(8)//开辟8个字节的存储空间,并把地址赋给指针p,通过指针p对该空间进行存取操作。
  *p=L //存储字符,所分配空间的第0字节存储L
  *(p 1)=o//分配空间的第一字节存储字符o.
  *(p 2)=v
  *(p 3)=e
  *(p 4)=
  puts(p)//输出字符串
  free(p)//释放空间
  注意:*(p n)等价于p[n],(p n)是地址,而*(p n)就是取地址(p n)的内容。
  如上面程序中的*(p 1)=A可写成p[1]=A
  malloc()函数的参数可以是常数、变量或表达式等。除了存放字符串外,malloc()也可取得空间来存储整数等数据。例如存储整数分配空间如下:
  int *ptr
  ptr=(int *)malloc(sizeof(int)*4)
  malloc()开辟空间存储4个整数数据,由于malloc()总传回第0字节的地址,且返回值必定是char*类型,所以要通过(int *)来强制转换为指向整型后存入指向整型的指针ptr.
  当用malloc()函数分配空间时,若计算机无法提供足够的空间分配则会返回NULL指针。所以,若返回的指针为NULL,就表示可分配的剩余空间已不足。

关于C语言动态分配内存的几个问题

动态分配内存和结构体指针 typedef struct { int x int y } point point *p=NULL 1.现在要为动态分配内存给p;代码为___p=(point*)malloc(sizeof(point)___ 2.在使用p之前,我们应该做动态分配内存是否成功的检查;代码为___if(p==NULL)___ 3. 现在要通过p将横坐标x设为3,纵坐标设为4;代码为___p->x=3p->y=4___ 4.用完后释放动态分配的内存;代码为___free(p)___

C语言动态内存分配

要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数

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=0count〈10count ) /*给数组赋值*/
array[count]=count
for(count=0count〈10count ) /*打印数组元素*/
printf("-",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函数是释放已经不用的内存区域的。

所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。
希望能解决您的问题。

c语言动态存储

#include
#include
#define N void main()
{
    int *p[N],t,i
 for(i=0i<3i )
 {
  p[i]=(int *)malloc(sizeof(int))
  scanf("%d",p i)
 }
 for(i=0i<3i )
  if(*(p i)>*(p i 1))
  {
   t=*(p i)
   *(p i)=*(p i 1)
   *(p i 1)=t
  }
 
 printf("%d%d%d ",*p,*(p 1),*(p 2))
}

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 的作用 就 是相当于数组名。 引用动态的数组。

最新文章