堆上申请数组

  • 方法一:通过数组指针申请连续的空间
  • #include <stdio.h>
     2 #include <stdlib.h>
     3 int main()
     4 {
     5     // 申请a[3][2]三行两列二维数组
     6     int (*a)[2] = (int(*)[2])malloc(sizeof(int)*3*2);
     7     a[0][0] =1;
     8     a[0][1] =2;
     9     a[1][0] =3;
    10     a[1][1] = 4;
    11     a[2][0] =5;
    12     a[2][1] = 6;
    13     printf("%d\t%d\t%d\t%d\t%d\t%d\n",a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1]);
    14     printf("%x\n%x\n%x\n%x\n%x\n%x\n",(int)a,(int)&a[0][1],(int)&a[1][0],(int)&a[1][1],(int)&a[2][0],(int)&a[2][1]);
    15     free(a);
    16     return 0;
    17 }
  • 
    
  • 注意,理解指针a的类型为int(*)[2]是理解算法的关键。
    
  • 方法二:同C++,容易理解的,多个一维指针申请多次,但空间不连续。
     1     int **a;
     2     int i;
     3     a = (int **)malloc(sizeof(int *)*3);
     4     for (i=0; i<3; i++)
     5         a[i] = (int *)malloc(sizeof(int)*2);



          两种方法各有优劣


          其实用 alloc()更规矩些 


时间: 2024-08-21 18:37:12

堆上申请数组的相关文章

C++在堆上申请和释放内存 - new &amp; delete

// 动态申请内存, 指向一个未初始化的整型 int *pi = new int; // pi指向一个整型值,初始化为0 int *pi = new int(); // value of i is 1024 int i(1024); // pi指向1024 int *pi = new int(1024); // value of  s is "99999" string s(5, '9'); // *ps is "999999" string *ps = new s

C++中只在栈上或者堆上申请对象

最近阅读Mitsuba的架构,有一个挺有意思的设计,开始没看明白.搜了下资料才搞懂. 有一个基类Object,它的析构函数是protected访问权限的.并且,所有继承Object的类,都需要实现一个自己的protected的析构函数. Mitsuba还特意解释了,这是为了防止在stack上构建Object的对象. 这是怎么回事呢? ”编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查.如果类的析构函数是私有的,则编译器不会在栈

天生棋局(堆上申请二维空间的应用)

1 #include <stdio.h> 2 #include <stdlib.h> 3 /* 4 天生棋局 5 */ 6 #define N 10 7 //1.传入一个n在堆空间中产生n*n方格的棋盘(生成一个n*n的二维空间) 8 int **createboard(int n) 9 { 10 int **p = (int **)malloc(n*sizeof(int*)); 11 for(int i = 0;i<n;i++) 12 { 13 p[i] = (int *)

C++ 在堆上开辟与释放二维、三维指针

//C++ 在堆上开辟与释放二维.三维指针 #include<iostream> using namespace std; int main() { //二级指针的开辟与释放 int number = 0; int** p = new int*[4]; for(int i = 0; i < 4; i++) //分级定义数组大小 { p[i] = new int[4]; } for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j

C++中栈和堆上建立对象的区别

在C++中类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* p=new A(),A*p=(A*)malloc():静态建立一个类对象,是由编译器为对象在栈空间中分配内存,通过直接移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.动态建立类对象,是使用new运算符将对象建立在堆空间中,在栈中只保留了指向该对象的指针.栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值,对象的引用地址等.其操作方式类似于数据结构中的栈,通常都是被调用时处于存储

block存储区域——如何验证block在栈上,还是堆上

block存储区域 这就需要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字说的那样,说明了block的三种存储方式:栈.全局.堆. [要点1]定义在函数外面的block是global的:另外如果函数内部的block,但是没有捕获任何自动变量,那么它也是全局的.比如下面这样的代码: typedef int (^blk_t)(int); for(...){ blk_t blk

OC高级编程——深入block,如何捕获变量,如何存储在堆上

首先先看几道block相关的题目 这是一篇比较长的博文,前部分是block的测试题目,中间是block的语法.特性,block讲解block内部实现和block存储位置,请读者耐心阅读.具备block基础的同学,直接调转到block的实现 下面列出了五道题,看看能否答对两三个.主要涉及block栈上.还是堆上.怎么捕获变量.答案在博文最后一行 //-----------第一道题:-------------- void exampleA() { char a = 'A'; ^{ printf("%

/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题

一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1)         打开项目的Property Pages对话框 2)         点击左侧C/C++节 3)         点击Code Generation节 4)         右侧第六行Runtime Library项目 2.各个设置选项代表的含义 编译选项 包含 静态链接的lib 说明 /MD _MT._DLL MSVCRT.lib 多线程.Release.DLL版本的运行时库 /

struct对象可能分配在托管堆上吗

struct对象可能被分配在托管堆上吗? --会的. 比如当对struct装箱的时候,就会被分配在托管堆上. 比如,让一个struct实现一个接口. public interface IReport { string Name { get; } } public struct Score : IReport { public string Name { get { return "80分来自struct"; } } } 再来一个类负责打印接口属性值的类和方法. public class