char *p;
new p[width*height];

解决方案 »

  1.   

    DragonCheng
    你那种方法自己用过吗!!!!
    不会不要误人!
    其实二维与一维本质是一样的,只是用二维比一维更方便。
      

  2.   

    我的意思是我要开一个数组如:
    long lTmp[2][3];
    只是因为无法确定维数,所以要通过new产生
    好象用
    long **lp=new long[i][j];
    连编译都通不过后来我试出来了,不知这样对否?(编译通过的)
    long **lp=new long*[i];
    for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];
    还有,怎么删呢?
      

  3.   

    比较清晰的定义可以采用下面的方法,bcc5.5编译通过.
    main()
    {
    long **  i;
    i=(long **)new long[4][5]; delete *i;
    delete i;

    }
      

  4.   


    用DragonCheng的方法可以的,比如说,为一个高和宽分别为Height、Width的位图
    开一个内存,就可用上面的代码。
    char *p=new p[width*height];
    .....
    if(p)
       delete p;
      

  5.   

    long **lp=new long*[i];
    for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];
    .
    ...
    删除:
    for(int nCount=0;nCount<i;nCount++) delete [] long[nCount];
    delete [] long;
      

  6.   

    Lasie, 所谓二维,如二维数组者,只是有许多指针,而每一指针又指向所谓一维的一些内存而已;而在内存中不管是指针还是一般的变量都是几个字节的变量;
           所谓new,只管分配一块内存,而不管这内存做什么用,也不会将内存结构化(指定哪些是一般变量,哪些是指针)。
    因此,要分配一块所谓二维的内存块,只有先分配一块内存块存放许多指针,然后再给每个指针分配一块内存使之指向它。 删除时先删除每个指针所指向的内存块,再删除这些指针占据的内存块。 对应于你上面的程序段,可这样删除:
            for(int nCount=0;nCount<i;i++)
                        delete lp[nCount];
             delete lp;
      

  7.   

    to chiesaitaly:
    删的时候出错!
      

  8.   

    to AtCsdn:
    删除数组,难道不要用delete[]吗?只要delete就行了吗?
      

  9.   

    两种方法那中正确或者更好一点:
    A:
    long **lp=new long*[i];
    for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];B:
    long **  i;
    i=(long **)new long[4][5];
      

  10.   

    对不起,上面的方法不能解决new long[i][j]的问题.
    你的申请方法是对的.我的删除方法也错了.
    应该是
    for ( ....)delete[] *(i+index);
    delete[] i;这样看的话,可以写一个类,用于申请和删除二维数组.
    不知道有没有更好的方法
      

  11.   

    大家好快阿.
    看来我的C++还是学的不行.
    不过我会常来csdn要大家请教的.刚才我说用类来申请二维数组,仔细想想问题也很多,不太可行,
    大家以为呢.
      

  12.   

    又出错,呵呵.改成"常来csdn,向大家请教"
      

  13.   

    Try these 2 functions I coded long time ago:template <typename Item>   
    Item ** allocate_2DArray (const size_t ksizeRowInit, 
                              const size_t ksizeColInit)
    {
       Item ** prgprgitemTemp;
       size_t i;
       ssizeRow = ksizeRowInit;
       ssizeCol = ksizeColInit;
       prgprgitemTemp = new Item * [ksizeRowInit];
       for (i=0; i<ksizeColInit; i++)
          prgprgitemTemp[i] = new Item [ksizeColInit];
       return prgprgitemTemp;
    }template <typename Item>
    void free_2DArray(Item ** prgprgitemToFree)
    {
       size_t i;
       for (i=0; i<ssizeRow; i++)
          delete [] prgprgitemToFree[i];
       delete [] prgprgitemToFree;  
    }
      

  14.   

    我建议使用DragonCheng的方法,对于元素的访问,完全可以自己做一个inline的函数,很方便,而且也很容易理解。我做过一个矩阵类就是这样处理的。
      

  15.   

    DragonCheng的方法线性的内存,二维的使用比如申请动态的m * n(m列n行) 的 int数组
    int *pArray = new int [ m * n];然后动态的使用int I24 = *(pArray + m * 4 + 2);这样删除也很简单,以此类推,也可使用三维的动态数组int *pArray = new int [ m * n * p];
    int I325 = *(pArray  + m * n * 5 + n * 2 + 3);
      

  16.   

    不能直接分配动态的二维空间.后面一维必须是固定的.因为否则编译器无法为你做出行指针,
    同样多维空间都需要后n-1维固定.
    这是编译器的要求.不过,你可以用for循环来分配,这是可以的.
    其他前面大家都说过了.呵呵
      

  17.   

    c++Builder编译
    *,&,[]的关系是一个c程序员必须知道的基本知识
    #pragma hdrstop
    #include <condefs.h>
    #include<stdio.h>
    //---------------------------------------------------------------------------
    #pragma argsused
    int main(int argc, char* argv[])
    {
            int a[2][2]={1,2,3,4};
            if(**a==a[0][0])
            printf("**a==a[0][0] is right");
            if(*a==&(a[0]))
            printf("*a==*(a[0]) is right");
    }
      

  18.   

    先new一个指针数组,再为每个指针new一块内存。
    当然,这只是个想法,我没试过。
      

  19.   

    这么用,肯定可以,我试过,哈哈。
       typedef long * PLONG;
       PLONG * pp=new PLONG[20];
       pp[0]=new long[10];
       pp[1]=new long[10];
       pp[0][0]=1;
       pp[0][1]=2;   delete []pp[0];
       delete []pp[1];
       delete []pp;
      

  20.   

    一定要用new吗?
    用mfc的CObjectArray不更是小菜一蝶吗?
      

  21.   

    to Lansie:
    你的写法其实和我上面的帖子是一样的:
    long **lp=new long*[i];肯定是正确的,lp只是一个指向指针的指针(指向一个指针数组),指针数组中的每一个指针还需要象你下面写的那样初始化:for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];删除时正好相反,看我上面的帖子吧,照着写一个循环就可以了。
      

  22.   

    why not use my code? what? Don't know templete? HAHAHA.... 
    Btw, ssizeRow is the static varable for row, and ssizeCol for colomn.