malloc()与realloc()用法

malloc()与realloc()用法  


malloc()与realloc()
  原型:extern void *malloc(unsigned int num_bytes);
  用法:#include <alloc.h>
  功能:分配长度为num_bytes字节的内存块
  说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
        当内存不再使用时,应使用free()函数将内存块释放。
  举例: 
     ///注: 例子是sno_guo写的。
 // malloc.c    
#include <stdio.h>
#include <stdlib.h>
#define MALLOC_SIZE 1024*1024
main()
{
    int *p;
    int i;
    int *p1;
 ///注意这个地方一定要加上sizeof(int) 如不加则p是int类型,一次访问4个字节的内存,这样实际可写的内存大小是MALLOC_SIZE/4,
 ///假如你写入了MALLOC_SIZE大小的数据,就造成了数组的越界。    
    p=(int  *)malloc(sizeof(int)*MALLOC_SIZE);  
    if(p)
      printf("Memory Allocated at: %x\n",p);
    else
      printf("Not Enough Memory!\n");
		 
		 p1=p;
		 for(i=0;i<MALLOC_SIZE;i++)
		 {
		   *p=i;
		    p++;
		 }
		 
    free(p1);   ///注意这里:如果直接释放p会导致内存错误,看man手册:  free()  frees  the memory space pointed to by ptr, which must have been
              /* returned by a previous call to malloc(), calloc() or realloc().  Other‐
       wise,  or if free(ptr) has already been called before, undefined behav‐
       ior occurs.  If ptr is NULL, no operation is performed.*/

    return 0;
}



看看这个个问题程序(这里用的是TC编译器):


#include "stdlib.h"
#include "stdio.h"
void main()
{
   int *i;
   i=(int *)malloc(sizeof(int));
   *i=1;
   *(i+1)=2;
   printf("%x|%d\n",i,*i);
   printf("%x|%d",i+1,*(i+1));
}
输出的结果是:
8fc|1
8fe|2
这个程序编译通过,运行正常,说它有问题,问题出在哪呢?首先通过malloc,建了一个大小为2的堆,i指向的地址是8fc,i+1指向的地址是8fc+sizeof(int)=8fe。但是地址8fe是不受保护的,因为它不是机器分配给i+1的,随时会被其他变量占用。
正确的做法是
#include "stdlib.h"
#include "stdio.h"
void main()
{
   int *i;
   i=(int *)malloc(sizeof(int));
   *i=1;
   i=(int *)realloc(i,2*sizeof(int));
   *(i+1)=2;
   printf("%x|%d\n",i,*i);
   printf("%x|%d",i+1,*(i+1));
}
    realloc 可以对给定的指针所指的空间进行扩大或者缩小,"提z网R9教R育5b5的无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。
    所以,在代码中,我们必须将realloc返回的值,重新赋值给 p :
    p = (int *) realloc (p, sizeof(int) *15);
   甚至,你可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。
   int* p = (int *) realloc (0,sizeof(int) * 10);  //分配一个全新的内存空间, 
   这一行,作用完全等同于:
   int* p = (int *) malloc(sizeof(int) * 10); 
 『附注:TC编译器里sizeof(int)=2,VC里面sizeof(int)=4;
  char型在两个编译器里是一样的,都是1个字节(8位)』 
calloc与malloc相似,参数nelem为申请地址的单位元素长度,elsize为元素个数,如:
char* p;
p=(char*)calloc(sizeof(char),20);
这个例子与上一个效果相同


realloc 
  原型:extern void *realloc(void *mem_address, unsigned int newsize);
  用法:#include <alloc.h>
  功能:改变mem_address所指内存区域的大小为newsize长度。
  说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
        当内存不再使用时,应使用free()函数将内存块释放。
  举例:
      // realloc.c
      #include <syslib.h>
      #include <alloc.h>
      main()
      {
        char *p;
        clrscr();        // clear screen
        p=(char *)malloc(100);
        if(p)
          printf("Memory Allocated at: %x",p);
        else
          printf("Not Enough Memory!\n");
        getchar();
        p=(char *)realloc(p,256);
        if(p)
          printf("Memory Reallocated at: %x",p);
        else
          printf("Not Enough Memory!\n");
        free(p);      
        getchar();
        return 0;
      }     


  相关函数:calloc,free,malloc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这三个函数都是C语言中用于动态内存分配的函数。 1. malloc `malloc`函数用于分配指定大小的内存块,并返回指向该内存块的指针。如果分配失败,则返回NULL用法:`void *malloc(size_t size);` 示例: ``` int *p = (int*) malloc(sizeof(int)*10); if (p == NULL) { printf("Memory allocation failed\n"); } else { // 内存分配成功,可以使用p指针来操作分配的内存 p[0] = 1; p[1] = 2; // ... free(p); // 使用完后需要释放内存 } ``` 2. calloc `calloc`函数也用于分配指定大小的内存块,但是与`malloc`不同的是,`calloc`会将分配的内存块的每个字节都初始化为0,并返回指向该内存块的指针。如果分配失败,则返回NULL用法:`void *calloc(size_t num, size_t size);` 示例: ``` int *p = (int*) calloc(10, sizeof(int)); if (p == NULL) { printf("Memory allocation failed\n"); } else { // 内存分配成功,可以使用p指针来操作分配的内存 p[0] = 1; p[1] = 2; // ... free(p); // 使用完后需要释放内存 } ``` 3. realloc `realloc`函数用于重新分配已经分配的内存块的大小,并返回指向该内存块的指针。如果分配失败,则返回NULL。如果新的内存块大小比原来的小,则可能会导致数据丢失。 用法:`void *realloc(void *ptr, size_t size);` 示例: ``` int *p = (int*) malloc(sizeof(int)*10); if (p == NULL) { printf("Memory allocation failed\n"); } else { // 内存分配成功,可以使用p指针来操作分配的内存 p[0] = 1; p[1] = 2; // ... int *q = (int*) realloc(p, sizeof(int)*20); if (q == NULL) { printf("Memory reallocation failed\n"); } else { // 内存重新分配成功,可以使用q指针来操作分配的内存 q[10] = 11; q[11] = 12; // ... free(q); // 使用完后需要释放内存 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值