动态申请空间

#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);
  这个例子与上一个效果相同

动态申请空间,布布扣,bubuko.com

时间: 2024-10-02 05:05:05

动态申请空间的相关文章

C++动态申请二维数组与拷贝构造函数

一.C++动态申请二维数组 在C++中不能直接动态申请二维数组,经过一番搜索,发现一种动态申请二维数组较好的方法. 代码如下(MATRIX_TYPE为某一种类型,Lines和Columns): MATRIX_TYPE** elem; //C++二维矩阵动态申请空间 elem = new MATRIX_TYPE*[Lines]; elem[0] = new MATRIX_TYPE[Lines * Columns]; for(int i = 1; i < Lines; i++) elem[i] =

C与C++申请动态内存空间的异同

C与C++申请动态内存空间的异同 C语言与C++的关系,我们可以这样来形容,C++继承于C语言,却两者都有各自独特的特性,比如在如何申请动态内存空间上有显著的差别. 首先我们要知道,为什么需要动态申请内存空间? 与动态分配相对应的是静态分配,在计算机中,内存分为栈区和堆区,其中栈区的空间相对于堆区会小很多,可以理解为,自己的家和仓库. 静态分配是在栈区提前分配一个固定大小的空间,而动态分配是需要多少分配多少,需要注意的是,动态分配需要程序员维护内存. 说了大致的分别,现在我们来看C语言和C++动

C++二维数组动态申请内存

好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到了,顺便写下来,适当时候给C++初学者用用. -----------C++二维数组动态申请内存-------------- 如果对new和delete不是很了解的话可以到这里来看看,http://www.cnblogs.com/hazir/p/new_and_delete.html 首先,我们一般需

C++中动态申请数组

动态申请一维数组 申请使用new,释放使用delete[] 可以通过数组名[下标]和*(数组名+下标)的方式访问数组 int main() { int number = 10; int *array = new int[number]; //数组初始化 for (int i = 0; i < number; ++i) { array[i] = i; } for (int i = 0; i < number; ++i) { cout << *(array + i) <<

C++中动态申请二维数组并释放方法

C/C++中动态开辟一维.二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下. C++中有三种方法来动态申请多维数组 (1)C中的malloc/free (2)C++中的new/delete (3)STL容器中的vector 下面逐一介绍: 第一种:malloc/free 1.动态开辟一维数组 [cpp] view plaincopy //动态开辟一维数组 void dynamicCreate1Array() { int m; int i; int *p; printf("

C语言和C++中动态申请内存

在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h> 然后用C语言的系统函数 void * malloc(usigned size);来获得动态分配的内存,这个函数参数是需要申请的内存的字节数,返回的是一个申请到的内存的首地址,这个返回的内存的类型是 void ,所以需要根据需要进行强制类型转换,例如 int *array; array= (int *)malloc

动态申请和释放一个二维数组

动态申请一个二维数组也很常见,下面是常见的两种形式. //方法1 unsigned char** pImg= new unsigned char*[m]; for(int i=0;i<m;i++){ pImg[i]=new unsigned char[n]; } //方法2 unsigned char** pImg= new unsigned char*[m]; unsigned char* arr= new unsigned char[m*n]; for(int i=0;i<m;i++){

Android之动态申请权限(API23以上需求)

API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全. 这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写必定可读) <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> · 动态申请权限的过程: 1 package com.dragon.android.permissionreque

C++算法之 写自己的栈stack 动态申请

myStack.h #pragma once //typedef int TYPE; template<typename TYPE> class myStack { TYPE* m_pData;//用new在堆上动态建立 int m_nTop; int m_nCount; public: bool isFull() { return m_nTop+1 >= m_nCount; } bool isEmpty() { if (m_nTop < 0) { return true; } e