精华内容
下载资源
问答
  • 二维数组分配内存

    千次阅读 2018-08-25 17:20:30
    今天刷leetcode的时候遇到的,一维数组分配内存可以直接使用malloc就可以了,如下: 给一个数组大小为n的整型数组分配空间:int *p = (int*)malloc(n*sizeof(int))  但是二维数组则不能像这样直接分配,否则会在...

    今天刷leetcode的时候遇到的,一维数组分配内存可以直接使用malloc就可以了,如下:

    给一个数组大小为n的整型数组分配空间:int *p = (int*)malloc(n*sizeof(int))

     但是二维数组则不能像这样直接分配,否则会在编译或运行时内存报错,而是需要分两步进行内存分配,先分配行,后分配列,如下:

    给一个n*m数组分配内存空间

    int **arr = (int **)malloc(n*sizeof(int *));
     for(i=0;i<n;i++)
         arr[i] = (int *)malloc(m*sizeof(int));

    需要注意的是第一步分配时后面是使用的sizeof(int*),如果写成sizeof(int),我测试在qt中编译运行都没有问题,但是如果在leetcode上面运行则会报错“double free or corruption (out)”。

    另外参考的网上的文章,在释放内存的时候:

    要先释放列,再释放行。注意,顺序反了的话,会把列的地址擦除,导致释放列时内存时找不到地址,程序崩溃。

      for (i = 0; i < n; i++)
         free(arr[i]);/*释放列*/

     free(arr);/*释放行*/

    参考文章地址:http://blog.csdn.net/ns_code/article/details/11357667

    展开全文
  • C++中用new给二维数组分配内存的使用方法 一、原理 首先要分开分配内存,如果还是用原来的一维数组的动态分配就不行了,比如 int** ptr = new int* [10 * 10]; /这句是指分配了100个int指针,并不是一1010的2维...

    C++中用new给二维数组分配内存的使用方法

    一、原理

    首先要分开分配内存,如果还是用原来的一维数组的动态分配就不行了,比如
    
     int** ptr = new int* [10 * 10]; /这句是指分配了100int指针,并不是一10102维数组。*/
    

    二、使用步骤

    1.先创建一个10个int型指针数组

    int **ptr = new int *[10]; //指针的数组
    

    2.在分别给每个指针的头指针分配内存

    for(int i=0;i<10;i++){
    	ptr[i]=new int[10]; /再分别给每个指针的头指针分配内存/
    }
    
    展开全文
  • CUDA之二维数组分配内存及初始化

    千次阅读 2018-10-17 16:38:23
    在GPU中,对一维数组分配内存使用的是cudaMalloc函数,但是对于二维数组,使用cudaMalloc来分配内存并不能得到最好的性能。因为对于2D内存,对齐是一个很重要的性质,cudaMallocPitch函数能够保证分配的内存是合理...

           在GPU中,对一维数组分配内存使用的是cudaMalloc函数,但是对于二维数组,使用cudaMalloc来分配内存并不能得到最好的性能。因为对于2D内存,对齐是一个很重要的性质,cudaMallocPitch函数能够保证分配的内存是合理对齐的,满足物理上的内存访问,因此可以保证对行访问时具有最优的效率。对数组进行初始化应当使用cudaMemset2D,进行内存赋值应当使用cudaMemcpy2D来实现。

    #include<cuda_runtime.h>
    #include<device_launch_parameters.h>
    #include<device_functions.h>
    
    #define M 33000
    #define N 16
    
    __gloabal__ void build_transMat(float* d_transMat, size_t pitch)
    {
        int count = 1;
        for(int j = blockIdx.y * blockDim.y + threadIdx.y; j < M; j += blockDim.y * gridDim.y)
        {
            float* row_d_transMat = (float*)((char*)d_transMat + j * pitch);
            for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)
            {
                row_d_transMat[i] = count;
                count++;
            }
        }
    }
    
    int main(int argc, char* argv[])
    {
        float* d_transMat;
        float* transMat;
        size_t pitch;
        transMat = (float*)malloc(sizeof(float)*M*N);
        cudaMallocPitch(&d_transMat, &pitch, sizeof(float) * N, M);
        cudaMemset2D(d_transMat, pitch, 0, sizeof(float) * N, M);
        build_transMat<<<blockSize, threadSize>>>(d_transMat, pitch);
        cudaMemcpy2D(transMat, sizeof(float) * N, d_transMat, pitch, sizeof(float) * N, M, cudaMemcpyDeviceToHost);
        for(int i=0; i<N; i++)
            cout << transMat[i] << endl;
        cudaFree(d_transMat);
        free(transMat);
        return 0;
    }

    上面的代码就是使用cudaMallocPitch来为一个M行N列的矩阵分配GPU内存空间,pitch实际上就是指一行的内存大小(sizeof(float)*N)。

           当我们使用cudaMalloc的时候,分配的是线性内存,类似于C语言中的malloc函数,连续的内存空间,从上一个元素访问到下一个相邻元素的代价比较小。如果是一个100*100的二维数组,我们依旧使用cudaMalloc来分配10000个内存空间的话,那我们访问某一行就要遍历前面所有的元素去访问,为了减小访问单行的代价,我们希望每一行的起始地址与第一行的地址是对齐的。同时,如果数组在GPU的共享内存中,通常数组会被划分到几个不同的bank中,这样有多个线程访问时就会访问到不同的bank,如果我们希望每一行可以被并行访问的话,就需要保持地址对齐。

            cudaMallocPitch所做的事情是:首先分配第一行的空间,并且检查它的总字节数是否是128的倍数,如果不是,就再多分配几个空余空间,使得总大小为128的倍数,这样一行的大小(包括补齐部分)就是一个pitch,然后以此类推分配其他行。最后,分配的总内存要大于实际所需的内存。因此,现在我们访问某一行的元素时,不是按照原来的a[i*row+j],而是使用a[i*pitch+j]来访问。因此,使用cudaMallocPitch时,一定要返回pitch,才能访问二维数组的某个元素。

            当我们进行二维内存复制时,如果直接使用cudaMemcpy不仅复制了数组的元素,同时也复制了补齐的内存。但是,我们希望的只是复制二维数组的元素部分,就可以使用cudaMemcpy2D来使用,值复制有效元素,跳过补齐的内存。

    展开全文
  • 今天参加笔试,其中有两题是分配内存的,第一题是动态分配一个一维数组,第二个题是动态分配一个二维数组.第一题和第二题我分别是这样写的: /*第一题*/ p=(float*)malloc(sizeof(float[M])); /*第二题*/ p=...

    今天参加笔试,其中有两题是分配内存的,第一题是动态分配一个一维数组,第二个题是动态分配一个二维数组.第一题和第二题我分别是这样写的:

    /*第一题*/

    p=(float*)malloc(sizeof(float[M]));

    /*第二题*/

    p=(float*)malloc(sizeof(int[M][N]));

    结果说我第二题错了,我还不明白错哪了,我又问写成M*N对不,结果还是说不对.刚查了一下,二维数组应该分别第一维和第二维分配空间,而我一次就分配了,所以错在这里了,正确的应该这样:

     

    int i;

    int **p;

    p=(int*)malloc(sizeof(int)*M);/*给行分配空间*/

    for(i=0;i<M;i++)

    {

         p[i]=(int*)malloc(sizeof(int)*N);/*给列分配空间*/

    }

     

    整体意思就是分配M行,每行有N个单元,即第一维都是指向N个单元的指

    展开全文
  • //C++方式  ...注意:分配完二维数字的动态空间后,需要分配一维数组的内存,否则直接传入函数,会导致没有分配内存,程序出错 转载于:https://www.cnblogs.com/quxiaoxia/p/6148773.html
  • #include <iostream> using namespace std; //分配内存空间 int **a; a=(int **)malloc(1000*sizeof(int*));... //.......给二维数组a[1000][1000]分配内存空间部分有问题,应如何分配?
  • 如何给二维数组分配动态内存
  • 一.一维数组 (一)一维数组定义格式 ...()一维数组的初始化 Java中的数组必须先初始化,然后才能使用 (1)初始化的分类: a:动态初始化: 只指定长度,由系统给出初始化值 b:静态初始化...
  • 对于二维数组和二维指针的内存分配 这里首选说一下一维指针和一维数组的内存分配情况。 一维: 数组:形如int a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体表示,也就是...
  • C语言二维数组动态内存分配

    千次阅读 2019-09-19 20:57:15
    总结两种二维数组的动态分配内存方法
  • C++二维数组内存分配

    2016-09-02 12:42:00
    1.例如,给一个4*5的二维数组分配内存 方法一:直接申请二维数组,逐一分配内存 1 int **array; 2 //分配内存 3 array=new int*[4]; 4 5 for (int i=0;i<4;i++) 6 array[i]=new int[5]; 7 8...
  • C语言中二维数组动态分配内存

    万次阅读 2013-09-01 13:01:49
    最近《数据结构》看到哈夫曼树的构造一部分的...这就涉及到二维数组内存的动态分配问题,先来看如何给一个普通的4行5列二维数组分配内存。 [code=c] int **p; int i; if( NULL == (p = (int **)malloc(4 * sizeof(in
  • #include #include int main() { FILE *fp; fp=fopen("D:\\breast.txt","r"); // 判断文件是否打开成功 ...我做了好久(哭),我就是想把那些数据整齐的正确的放在二维数组中,然后使用里面的数据… 求助……
  • 今天在学习JAVA二维数组时,发现和C++二维数组分配不同: JAVA中, 定义了一个二维数组arr[3][4],输出arr和arr[0]发现两个地址不一样。 而对于C++来说应该是一样的。所以这就涉及到两种语言二维数组的内存分配的...
  • 二维数组动态分配内存 C 二维数组动态分配和释放 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf(&...
  • 今天我们来聊聊二维数组及其二维数组的动态内存分配关知识。 1.数组的基本定义 我们都知道,数组是典型的线性存储,是一种最基本的存储表示方法, 把逻辑上相邻的元素存储在物理位置相邻的存储单元中,由此得到的...
  • C/C++二维数组及一维指针数组内存分配 我们以char 类型的二维数组为例吧;char array[3][5];这个数组的内存空间是怎么样的呢? 可以把它理解成一个矩阵的形式,他所占的字节数==3 * 5 * sizeof(char),就是15个...
  • 指针数组、数组指针、二维数组动态分配内存 2016-03-22 22:59 838人阅读 评论(0) 收藏 举报  分类: C(7) C++(12)  目录(?)[+] 1. 二维数组动态分配和释放 1. 已知第...
  • C语言二维数组矩阵动态内存分配

    千次阅读 2014-07-30 22:29:06
    原文链接: 最近去参加面试,遇到二维数组矩阵动态内存分配,面试官当场叫...回来想想也并不是这么难,double类型的20*30二维数组分配内存 [cpp] view plaincopy double **p;  int i; 
  • //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char [N]) * m); free(a); //方法二 char **a; int i;

空空如也

空空如也

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

二维数组分配内存