c语言中-----分配内存函数

原型:

  void * realloc(void *p, size_t  size);

  realloc 可以对给定的指针所指的空间进行扩大 或者 缩小, 原有内存的数据保持不变。当然,对于缩小,则缩小部分的那一部分的内容会丢失;

  realloc 并不保证调整后的内存空间 和原来的内存空间保持同一内存地址。 而且 realloc 返回值很可能的是一个新的地址;

这是因为realloc是从堆上分配内存的, 当扩大一块内存空间时,realloc直接从堆上现存的数据后面的那些字节中获得附加字节空间;但是如果数据后面的字节空间不够的话,那么就使用堆上第一个有足够大小的自由块,现存的数据拷贝到新的位置,而老块又系统收回,还给堆;

如果我们采用i = (int*)realloc(i, 2*sizeof(int))的重新分配内存方式,有以下两种情况:

  1.分配成功,返回void*指针:realloc返回值如果与前面malloc的值不同,那么realloc函数完成后,i指向的旧内存自动free掉。

  2.分配失败,返回NULL值:此时,i原来指向的内存还没有被free掉,而现在又找不到地址,这样就出现memory
leak了。 

  解决办法:定义另一个指针j用于接收realloc返回值,判断是否成功,成功则将j赋给i

时间: 2024-12-21 21:01:17

c语言中-----分配内存函数的相关文章

C语言编程中分配内存空间的相关函数_C 语言

C语言malloc()函数:动态分配内存空间头文件: #include <stdlib.h> malloc() 函数用来动态地分配内存空间(如果你不了解动态内存分配,请查看:C语言动态内存分配及变量存储类别),其原型为: void* malloc (size_t size); [参数说明]size 为需要分配的内存空间的大小,以字节(Byte)计. [函数说明]malloc() 在堆区分配一块指定大小的内存空间,用来存放数据.这块内存空间在函数执行完成后不会被初始化,它们的值是未知的.如果希望

深入理解函数中分配内存的问题

先看这样的代码  1void MyNew(int *p) 2{ 3    p = new int; 4} 5 6int main() 7{ 8    int *p = NULL; 9    MyNew(p);10} 开始写了一篇函数中分配内存的问题,通过说明他们产生了拷贝,而导致p不能成功分配.但并未提出事实根据,下面我们来仔细看看具体原因. 我们需要弄清两点:1.main函数中的p与MyNew函数中的p是不是一样:2.如果不一样,是怎么导致了不一样的. 第一点很好看,我们可以在编译器(VC环境

函数中分配内存的问题

只是为了能够让自己讲清一些事! 大家都知道,如果想要在在C++的函数中分配内存,那么就只得使用指针的引用传递,或是二级指针 如: void MyNew(int** p)   {       *p = new int;   }      void MyNew(int*& p)   {       p = new int;   }   而通常我们在开始的学习中,都会写成 void MyNew(int* p) {    p = new int; } 为什么这样分配不会成功呢? 原理很简单,就是形参传递

C语言中字符串常用函数strcat与strcpy的用法介绍

以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下   strcpy原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include <string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针.函数实现: 复制代

动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点

动态链接库中分配内存引起的        本文主要是探讨关于在动态链接库分配的内存在主程序中释放所产生的问题,该问题是我在刚做的PJP工程中所遇到的,由于刚碰到之时感动比较诡异(这也是学识不够所致),所以将它写下来,大家一起分享.        问题来由: 由于该工程中要用到声音,所以我的分工之一就是用DirectMusic和DirectSound来开发声音播放的动态库,以提供给该工程的两个部分:仿真控制部分( 语音 )和三维部分( 场景声音 )使用,两个工程中的声音都以单独的线程播放,且两个线

c语言-C语言中如何调试函数求指导

问题描述 C语言中如何调试函数求指导 C语言中如何调试函数?按F11几步之后进入了如下图一些文件中开始逐步调试,这是怎么回事? 就是一些诸如printf.c, _file.c的文件,怎么能跳过这些,调试函数呢? 解决方案 F9设置断点,F5调试运行,F11逐语句(可进入函数),F10逐过程(不进入函数),shift+F11跳出函数. 解决方案二: 就是一些诸如printf.c, _file.c的文件,怎么能跳过这些,调试函数呢? 解决方案三: 编译器是通过堆栈的形式给你调试的

printf-C语言中被调函数在主调函数的前面和后面有什么区别?

问题描述 C语言中被调函数在主调函数的前面和后面有什么区别? 一: void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("x=%d,y=%dn",x,y); } void main() { int a,b; //a,b是实参. scanf("%d,%d",&a,&b); swap(a,b); printf("a=%d,b=%dn",a,b); system(

模拟实现C语言中的内存管理_C 语言

这里模拟了C语言中的内存管理,当我们要创建或者使用一个对象时,那么这个对象会调用retain方法,计数+1,当我们要释放对象,我们会调用free,这里注意要对计数记性判断,如果是0的话,那么就会销毁. #import <Foundation/Foundation.h> int cnt = 0; void fun (charchar * p) { printf("%c\n",p[0]); } charchar * retain1(charchar * p) { //retai

c语言中字符串分割函数及实现方法_C 语言

1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a