精华内容
下载资源
问答
  • 申请内存空间和释放内存空间

    千次阅读 2016-10-12 22:02:05
    1、申请内存空间 2、释放内存空间

    1、申请内存空间


    2、释放内存空间


    展开全文
  • 适合初学者,大神莫笑。C语言打开文件、判断大小、申请内存空间、初始化内存空间,复制读文件内容到内存空间等等,fopen,ftell,fseek,malloc,memset,fread,free,详细应用带详细注解源代码!!!
  • 编写 C/C++程序时,经常需要申请内存,内存的申请与释放也是在编写程序中最需要注意的地方。和 Python 等程序不同的是,C/C++将内存的申请与释放的权限交给了程序员,如果程序员忘记了释放已经申请的内存,那么在...

    编写 C/C++ 程序时,经常需要申请内存,内存的申请与释放也是在编写程序中最需要注意的地方。和 Python 等程序不同的是,C/C++ 将内存的申请与释放的权限交给了程序员,如果程序员忘记了释放已经申请的内存,那么在程序运行结束前它会一直占据这个空间。随着程序的运行,有可能会占据的内存越来越多,最终导致系统崩溃。因此每次申请内存的时候,都不要忘记在合适的地方释放掉。本文主要介绍申请内存的几种方法,这些不同的方法各有其适用的场景,读者可以根据自己的实际情况进行选择。

    1. 首先是 malloc 函数,该函数的原型是 void *malloc(size_t size); 功能是分配 size 字节的未初始化内存块,如果成功分配,则返回数组的地址,否则返回 NULL。这个函数对于大部分程序员来说都是比较熟悉的,需要特别注意的有两点:第一点是该函数的返回值是 void * 类型,因此对于特定的数据类型,需要进行强制类型转换;第二点是这个函数只负责分配内存,并不会进行初始化操作,因此不可以直接引用内存块的值。

    2. 然后是 realloc 函数,该函数的原型是 void *realloc(void *ptr, size_t size); 函数功能是将 ptr 指向的内存块大小改为 size 字节,但是内存块内原来的数据都不会发生变化,新增加的内存块仍然是未被初始化的。

    3. 还有 calloc 函数,该函数的原型是 void *calloc(size_t nmem, size_t size); 函数的功能是为含有 nmem 个成员的数组分配空间,每个元素占 size 字节大。和前面两个函数不同的是,该函数可以将每个内存块初始化为0。

    4. 最后是 new 运算符,它在 C++ 程序中经常被使用。相比于前面几种申请内存的方法,使用 new 运算符不需要进行强制类型转换。在使用完这段内存空间之后,需要使用 delete 运算符将其释放掉。

    下面通过一段程序来看一下它们的具体使用方法:

    #include#include#includeusing namespace std;int main(){  int *a,*b;  int i;  a=(int *)malloc(sizeof(int)*4);  assert(a);  for (i=0;i<4;i++)    a[i]=i+1;  a=(int *)realloc(a,sizeof(int)*6);  a[4]=5;  a[5]=6;  for (i=0;i<6;i++)    cout<<"a["<"]="<  cout<<endl;  free(a);  a=(int *)calloc(4,sizeof(int));  assert(a);  for (i=0;i<4;i++)    cout<<"a["<"]="<  cout<<endl;  free(a);  b=new int[4];  for (i=0;i<4;i++)    b[i]=(i+1)*(i+1);  for (i=0;i<4;i++)    cout<<"b["<"]="<  cout<<endl;  delete []b;}

    下面是这段代码的运行结果:

    0b91e8b5ba7c4f01dcb488e6118ee922.png

    可以看到,在使用 calloc 函数申请内存之后,每个数组成员的值都被设置为了0。因此为了避免引用未初始化的内存块,建议使用 calloc 函数。

    有时候,需要对一个数组进行清零操作,常规的方法是使用循环,然后在循环内部进行赋值。但是当循环次数过多的时候,效率就比较低了。可以使用 memset 函数实现这一操作,该函数的原型是 void *memset(void *s, int ch, size_t n); ch 即是要初始化的值,n 是这段内存空间的大小。由于该函数存在于 string.h 头文件中,因此只有包含了这个头文件才可以使用这个函数。通过下面的程序了解下它的用法:

    #include#include#includeusing namespace std;int main(){  int *a;  int i;  a=new int[4];  for (i=0;i<4;i++)    a[i]=i+1;  for (i=0;i<4;i++)    cout<<"a["<"]="<  cout<<endl;    memset(a,0,sizeof(int)*4);  for (i=0;i<4;i++)    cout<<"a["<"]="<  cout<<endl;  delete []a;}

    下面是这段程序的运行结果:

    edd0854b54b9baa9474712b39bf52f14.png

    memset 函数不仅可以进行清零操作,还可以用来为新申请的内存进行初始化。它是对较大的结构体或数组进行清零操作的一种最快方法。

    以上介绍的各种申请内存空间的函数都有其适用的场景,请读者根据合适的情况进行选择,不必要一定使用 malloc 函数。无论是什么时候,都不要忘记释放掉申请的内存哦,即便是程序非常短,申请的空间很小,也要养成一个好习惯。俗话说,“好借好还,再借不难。”如果一直赖着不还的话,系统就会崩溃了hhh。

    展开全文
  • 区别是new/delete在底层还是借助malloc/free申请的内存空间,然后调用类的构造函数(先申请内存空间,然后调用构造函数创建对象),进行成员变量的初始化等一系列工作,最后返回对象的指针,delete会调用析构函数,...

    在C++中malloc/free和new/delete都可以动态申请内存
    区别是new/delete在底层还是借助malloc/free申请的内存空间,然后调用类的构造函数(先申请内存空间,然后调用构造函数创建对象),进行成员变量的初始化等一系列工作,最后返回对象的指针,delete会调用析构函数,malloc/free仅仅是申请内存空间,然后返回所申请内存空间的指针(没有类型的指针)。malloc/free不对调用类的构造函数和析构函数。

    所有在使用malloc为含有string对象的结构体申请内存空间时,没有调用 string的构造函数,编译就会出错。

    可以改用new关键字为结构体申请空间
    在这里插入图片描述

    展开全文
  • (1)没有申请内存空间: int *q; *q = 1; cout<<*q<<endl; 错误! 指针变量q没有空间,不能直接存放数据。 (2)申请内存空间: int *q = new int; *q = 1; cout<<*q...

    1. 指针所指向的地址需要存放数据的时候需要申请空间。

    int *q;只有地址,没有内存空间。这个地址是随机地址。

    (1)没有申请内存空间:

    int *q;
    *q = 1;
    cout<<*q<<endl;

    错误! 指针变量q没有空间,不能直接存放数据。

    (2)申请内存空间:

    int *q = new int;
    *q = 1;
    cout<<*q<<endl;

    正确,存放数据之前给指针变量申请了一个int类型大小的堆内存空间。

    2. 对比:

    int *q;
    *q = 1;

    错误!q没有指向一块内存空间,不能直接存放数据。

    int *q, a = 1;
    q = &a;

    正确,两次q的地址不一样。q=&a:q指向变量a所在的内存空间,变量a是一个int型,在内存中有大小为int类型的内存空间。算是间接地给q分配了空间吧。

    展开全文
  • 指针什么时候需要申请内存空间?? 1、指针所指向的地址需要存放数据的时候需要申请空间。 int *q;只有地址,没有内存空间。这个地址是随机地址。 (1)没有申请内存空间: int *q; *q = 1; ...
  • malloc申请内存空间失败

    千次阅读 2016-03-31 11:45:06
    都提到失败的原因可能是因为之前申请的内存空间出现越界操作,致使malloc分配失败,自己得到了一些启示,回头查看了最近一次malloc申请内存成功后的一些操作,最后调试发现就是最近一次申请的内存空间不足,...
  • 使用malloc函数申请内存空间需要了解:(malloc的原型为:(void *) malloc(int size) ) 1)内存分配给谁? 2)分配多大的内存? 3)是否还有足够内存分配? 4)内存将用来存储什么格式的数据? 5)分配的内...
  • 来自公众号:技术让梦想更伟大提出问题我们在写程序中经常会用到malloc函数进行动态内存分配,但是我们有没有想过,在C语言中,向操作系统请求malloc内存空间的地址是...每次申请一块内存空间#include"stdio.h"#incl...
  • 以三维数组为例先申请1个一维数组空间:mat = [None]*d1d1是第一维的长度。再把mat中每个元素扩展为第二维的长度:for i in range(len(mat)):mat[i][j] = [None]*d2类似的,把mat中每个元素扩展为第三维的大小:for ...
  • 动态申请内存空间

    千次阅读 2012-09-13 22:25:28
    1、动态申请一维内存 (1)、用malloc函数 #include #include #include int main() { int n=5; int *temp; temp=(int*)malloc(sizeof(int)*n); for(int i=0;i;i++) { temp[i]=i; } for(i=0;i;i+...
  • malloc()到底如何申请内存空间

    千次阅读 2018-07-24 10:49:32
    malloc()到底从哪里得到了内存空间? 答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。  操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就...
  • #include #include int **malloc2d(int row,int col) ...int** ret=(int**)malloc(sizeof(int*)*row);...int*p=(int*)malloc(sizeof(int)*row*col)...if(ret&&p)//如果从堆空间申请成功,ret和p地址就是非0; { fo
  • C语言动态二维数组,结构体动态申请内存空间

    千次阅读 多人点赞 2014-03-01 09:25:57
    这样的做法是错误的,我们需要动态申请数组内存,如下申请一个动态整数(int)二维数组: #include<stdio.h> #include<stdlib.h> int **pp(int m,int n) { int i,j,**pa; pa=(int **)malloc(sizeof...
  • 以三维数组为例先申请1个一维数组空间:mat = [None]*d1 d1是第一维的长度。再把mat中每个元素扩展为第二维的长度:for i in range(len(mat)): mat[i][j] = [None]*d2类似的,把mat中每个元素扩展为第三维的大小:...
  • 结构体中有int *number成员。...想将字符串中的内容转化为数值进行保存,由于字符串是手动输入的,所以想通过malloc()函数来进行内存申请,这样做可以吗?如果可以的话,程序总是停止运行,又是为什么?
  • 动态申请空间大小是看 内存内存有多大就能申请多大的空间? 1、看硬件的什么部件,硬件的物理内存大小? 2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来...
  • char*及char[]申请内存空间区别

    千次阅读 2014-04-11 15:30:40
    在程序员面试宝典中看到这两种申请内存方式,瞬间发觉自己
  • 方法一: int main() {  string ptr;  int m;  cin>>ptr>>m;  reverse(ptr.begin(),ptr.begin()+m);  cout  reverse(ptr.begin()+m,ptr.end()); ... reverse(ptr.begin(),ptr.end
  • 静态一维数组,在编译时就被分配了空间,使用起来非常方便。 然而,当事先不知道有多少数据时,数组的大小难以确定,如果采用大的数组,会造成空间的浪费。 因此,动态一维数组的需求很强烈。 现在的编译器基本都...
  • 在编程时,为了节省空间,我们经常会调用malloc函数来动态申请空间。但是,却不知道,正是因为这一点点的吝啬心,让我们的程序运行效率出奇的低。 那么,引起效率低下的原因是什么呢,接下来,让我们探索探索。 探索...
  • 为什么使用malloc函数时申请函数的的指针要强制类型转换,转换为和定义的数据类型相对应的同类型的指针。
  • 如果加上注释掉的代码的话,接下来打印的就是乱码,这里p相当于申请了13个字节的内存空间,p占4个字节,保存的是'h'的地址,那记录p的指向空间的大小的结构是什么。操作系统是怎么知道p所申请内存空间大小的。
  • Private Sub Form_Click()Dim S As New StdFontDim A As StdFontDim B As StdFont'给原始对象赋值S.... 因为 A 实际上并未非配内存空间.Set A = S'为 B 申请空间, 并将 S 的值赋予 B. 实际上是一个 Copy 的过程.Set ...
  • 如许,dma_alloc_writecombine 分派出来的内存不应用缓存,然则会应用写缓冲区。而 dma_alloc_coherent 则二者都不应用。   C B 位的具体含义 0 0 无cache,无写缓冲;任何对memory的读写都反应到总线上。...
  • 我现在需要处理一组很大的数据,在数据的处理过程中需要申请一些临时的内存来存储这些数据,而C语言可以用malloc()函数...请问在C#里面怎么来动态申请内存空间,用于存储运算过程的中间数据,并在最后释放这些空间呢?
  • 申请内存空间时,为了减少内存碎片,常常申请2的n次幂大小的空间,就可以用这种方式来对齐。 当然 ,一般好一点儿的操作系统,都在系统内做了相关处理,没有必要这样做。但做底层代码的话,还是很有用的。
  • 首先我们要知道,为什么需要动态申请内存空间? 与动态分配相对应的是静态分配,在计算机中,内存分为栈区和堆区,其中栈区的空间相对于堆区会小很多,可以理解为,自己的家和仓库。 静态分配是在栈区提前分配一个...
  • C++测试申请最大内存空间

    千次阅读 2017-02-14 15:51:55
    C++测试申请最大内存空间

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,544
精华内容 5,017
关键字:

申请内存空间