精华内容
下载资源
问答
  • 动态申请空间

    2014-08-15 22:17:00
    #include<iostream.h>#include<stdlib.h>void main(){int *p=(int *)malloc...//在内存动态存储区分配n个长度为size 的连续空间,函数返回值为指向分配域起始地址的指针int *yy=(int *)realloc(p,10);co...

    #include<iostream.h>
    #include<stdlib.h>
    void main()
    {
     int *p=(int *)malloc(10);
     int *cp=(int*)calloc(10,4);//在内存动态存储区分配n个长度为size 的连续空间,函数返回值为指向分配域起始地址的指针
     int *yy=(int *)realloc(p,10);
     cout<<p<<"  "<<sizeof(p)<<endl;
     cout<<cp<<"  "<<sizeof(cp)<<endl;
     cout<<yy<<"  "<<sizeof(yy);
    }
    //
     //0x003B0738  4
    //0x003B0770  4
    //0x003B0738  4

    首先看个问题程序(这里用的是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 可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。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);
      这个例子与上一个效果相同

    转载于:https://www.cnblogs.com/lirong21/p/3915775.html

    展开全文
  • c++动态申请空间的两种方法 第一种 使用二重指针(下面以int类型为例子) int **res=new int*[row]; for(int i=0;i<row;i++){ rew[i]=new int[column]; } 第二中 使用vector容器(仍然以int为例子) ...

    c++动态申请空间的两种方法

    第一种

    使用二重指针(下面以int类型为例子)

    int **res=new int*[row];
    
    for(int i=0;i<row;i++){
    
         rew[i]=new int[column];
    
    }

     

    第二中 使用vector容器(仍然以int为例子)

    vector<vector<int>> v(row,vector<int>(column));

     

    展开全文
  • 什么是指针以及如何动态申请空间

    千次阅读 2017-05-15 22:07:14
    int a;int *p;第一个比较熟悉,就是定义一个整型变量。第二个就是定义了一个整型指针变量p; 1.指针有什么作用?  指针是存储一个地址!注意是地址,不是什么具体的数值。...动态申请空间: int

    int a;int *p;第一个比较熟悉,就是定义一个整型变量。第二个就是定义了一个整型指针变量p;

    1.指针有什么作用?

         指针是存储一个地址!注意是地址,不是什么具体的数值。

    2.指针如何才能存储变量a的地址呢?

      p=&a;      //&符号为取地址符,也就是取了a的地址。

    3.如何输出指针内的数值?

        在C++中通过凑他cout<<*p;即可,注意是*p,因为p是一个地址,*p才是指向这个地址的实际数值。

    动态申请空间:

    int a;是在内存中申请一块区域来存储。malloc是程序在运行时根据实际情况申请合适的空间,比如用传统方式申请了100个内存,实际情况需要102个内存,那就必须修改你的程序,再重新发布新版本更新这个bug才行,费时费力。

    4.如何使用malloc函数?

      int *p = (int *)malloc(sizeof(int));  //malloc函数的默认返回类型是void *,这里进行强制类型转换。

     *p = 10;  //通过指针p对刚申请的内存进行操作,比如在这个空间存入整数10.

    展开全文
  • 1. 动态申请空间1.1 基本内容 Ⅰ 动态申请的空间没有具体名称,只能通过指针间接访问(无论new还是malloc方式)。  Ⅱ 动态申请空间都是存放在堆中,有别于系统自动分配的空间是存放在堆栈中(即栈)。  Ⅲ 栈中...

    1. 动态申请空间

    1.1 基本内容

      Ⅰ 动态申请的空间没有具体名称,只能通过指针间接访问(无论new还是malloc方式)。
      Ⅱ 动态申请空间都是存放在堆中,有别于系统自动分配的空间是存放在堆栈中(即栈)。
      Ⅲ 栈中系统分配的空间,在使用结束会自动释放。而程序员动态申请的空间则需要人为来释放,否则随着程序运行,内存占用积累,很容易造成内存泄漏,尤其在程序过大,运行时间过长的时候,更需要这些每个细节问题。

    1.2 常见空间申请方式

    1.2.1 malloc/free申请空间

      malloc/free是声明在c语言stdlib.h(或者c++语言的 cstdlib)头文件中,调用的时候记得添加头文件。
      具体格式如下:   

    #include<stdlib.h> 
    int nLen =100;
    char* pl;
    pl=(char*)malloc(nLen*sizeof(char));//申请nLen长度的存储char类型大小的空间
    
    free(pl);   //使用结束,释放空间 

      这里需要注意,空间申请的大小与形式,跟数据类型无关,它就是动态分配的一段地址。即malloc申请的空间是没有类型概念的,最后赋给具体指向哪种类型的指针,仅需强制转换到相应类型即可。
      例如:

    char* pl = (char*)malloc(10 * sizeof(int));

      上面程序虽然申请了10个长度存储int类型大小的空间,但跟赋给指向char类型的指针并不存在矛盾,地址是没有数据类型概念的。

    1.2.1 new/delete申请空间

      C中已经有了malloc/free,那为什么还需要new/delete呢?自然是前者不能满足c++中增加的关于类处理相关操作。
      由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够自动地调用构造函数和析构函数。即用无法满足动态对象的要求。因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
      也就是说new既能申请类对象空间,也能调用构造函数。
      具体使用如下:

    //变量
    int* nNum = new int(5);   //注意申请简单变量,也必须使用指针形式
    
    delete nNum;              //释放空间
    nNum = NULL;              //让指针指向空指针,杜绝野地址
    //一维数组
    int* nNum1 = new int[5];  
    
    delete []nNum1;            //释放空间,记住与变量不同
    nNum1 = NULL;
    //二维数组
    int (*pl)[4]              //必须点明列大小
    pl = new int[3][4];
    
    delete []pl;
    pl = NULL;

    2. 动态申请空间内存泄漏问题

      每个程序都包含一或多个进程运行,而每个进程都有自己的进程堆。虽然程序中动态申请的空间如果没有手动释放,在程序运行结束,也就是所有进程消亡后,系统也会将进程中申请的所有的内存资源全部释放。但是如果一旦程序运行时间过程,或者程序占用内存过大,进程就会耗尽系统所有内存,最终造成内存泄漏。
      所以避免程序出现内存泄漏的最好办法是,当使用动态空间完毕后,我们应该人为释放内存空间。
      


    个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

    转载请注明出处:CSDN 无鞋童鞋。

    展开全文
  • C++不能用变量定义数组长度,应通过指针来动态申请空间,实现动数组长度的变量赋值。 eg:int *A = new int[i];(i为变量) 问题描述: 某校门外长度为L的马路上有一排树,每两颗相邻的树之间的间隔都是1m。可以...
  • c++动态申请空间

    2014-06-14 17:20:08
    使用new申请空间: 特点:  1、没有名字,只能通过指针间接访问它们。  2、从堆中申请空间 分类: 变量:  语法:指针变量 = new 类型名;  Delete 指针变量  举例:int *p;  
  • 【C语言】动态申请空间

    千次阅读 多人点赞 2020-03-19 18:44:51
    在很多情况下,我们不知道所要建立数组的大小,而是想根据需求动态的建立数组。但是通常使用 int arr[n] 这样的写法编译器会报错,因为n是变量。 int n = 10; int array[n]; 一、动态建立数组 代码: #include<...
  • struct node{ char data[50]; char *name; node *left; node *right; };...若结构体中含有指针成员,那么创建一个结构体时,要使用malloc申请一块空间,用来存储这个...申请一块空间,大小为:sizeof(char)*50 + ...
  • (2) 矩阵空间采用new动态申请,保存在指针中; (3) 定义矩阵初始化函数,可以从cin中输入矩阵元素; (4) 定义矩阵输出函数,将矩阵格式化输出到cout; (5) 定义矩阵相加的函数,实现两个矩阵相加的功能,结果...
  • 动态申请空间malloc

    2015-03-21 11:32:20
    #include #include #include<stdlib.h> //重要!! using namespace std;int main(void) { cout请输入一个正整数n"; int n; cin>>n; freopen("a.in","r",stdin); freopen("a.out
  • C/C++动态申请空间方式

    千次阅读 2018-11-14 14:34:28
    1:C语言动态申请一维数组: #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; int main() {  int i=0;  int m=9;  int *p = (int*)malloc(sizeof(int)*m);  for(;i&lt;m; +...
  • 顺序表的动态开辟空间版本。顺序表的动态版本与静态版本的区别在于:动态版本预先开辟比较小的空间,当空间不足时再追加若干空间,静态顺序表则一次开辟足够大的空间,静态顺序表的实现在我的上一篇博客。
  • C/C++动态申请空间

    千次阅读 2016-08-15 17:33:54
    C语言中用malloc/free; C++里用new/delete;1:C语言动态申请一维数组:#include #include int main() { int i=0; int m=9; int *p = (int*)malloc(sizeof(int)*m); for(;i; ++i) {
  • 最近在百度知道看到很多...一 二维数组动态申请空间 假设我们要申请一个m行n列的整形数组,m、n的值可以在程序中动态改变 1 使用malloc和free: int **buf; //申请 buf =(int **)malloc(sizeof(int *)*m);for...
  • void main() {  int **a; int m,n; scanf("%d%d",&m,&n); *a=(int **)malloc(sizeof(int *)*m); for(i=0;i a[i]=(int *)malloc(sizeof(int *)*n); }
  • 在写一个有关字符串的程序的时候,动态申请空间,然后
  • new 与 delete 运算符在C++中用于动态分配内存。而在C语言中C库函数malloc 与 free 也可以用作动态分配内存。 malloc 与 free 使用实例: void *malloc(size_t size) /* malloc 与 free 使用 */ int* p = (int*)...
  • 程序由一个主函数和两个子函数构成;子函数为getData()和check()。getData用来读取数据,将数据存入内存,将内存地址返回给主函数。check负责检查数据传递是否正确。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,179
精华内容 1,671
关键字:

动态申请空间