【问题标题】:arrays of pointers to pointers 2d arrays指向指针的指针数组 二维数组
【发布时间】:2012-10-19 05:23:17
【问题描述】:

我试图在一个函数调用中创建一个连续的内存块,该函数调用将内存的第一部分作为指向其他块的指针数组。该函数使用索引表示法虽然我想使用紧凑指针

Type **TwoD(size_t rows, size_t cols) 
{
    Type **p1, **prows, *pcol;

    p1 = (Type **)malloc(rows * sizeof(Type *) + rows * cols * sizeof(Type));


//  ??? something wrong here ??? I'd rather use this style if possible
//  
    //index notation works

    return prows;
}

【问题讨论】:

    标签: arrays pointers multidimensional-array


    【解决方案1】:

    返回的prows值不同。

    在这种情况下更改了 prows:

    //  for (; prows < (Type **)pcol; ++prows, pcol += cols)
    //      *prows = pcol;
    return prows;
    

    而另一种情况,船头没有变化(仍然是p1):

    for (unsigned ii = 0; ii < rows; ++ii)
    {
       prows[ii] = pcol;
       pcol += cols;
    }
    return prows;
    

    所以,你可以做的是最后返回 p1 而不是 prows。

    【讨论】:

    • 当我使用 p1 作为返回值时,我仍然得到分段错误:11。
    • 我想通了,每次增加 pcol+= cols 时,我都会更改 for 循环的终止部分,因此 for (end = p1 + rows; prows
    • 我个人更喜欢索引符号的方式,似乎更容易理解。
    【解决方案2】:

    试试这个:

    // ======i make change here=========================
    // =====================V===========================
    for (; prows < (Type **)&pcol; ++prows, pcol += cols)
        *prows = pcol;
    
    return p1;
    

    【讨论】:

      【解决方案3】:

      我觉得二维数组有点复杂。我总是用一维数组来表示一个二维数组,例如:

      typedef int Type; // for simplicity, assume int
      
      Type *TwoD(size_t rows, size_t cols) {
          Type *array = (Type*)malloc(rows * cols * sizeof(Type));
          Type *p = array;
          Type counter = 0;
          for (size_t row = 0; row < rows; row++) {
              for (size_t col = 0; col < cols; col++) {
                  *p++ = counter++;
              }
          }
          return array;
      }
      
      /* The array will look like this, for rows=3, cols=4:
      0  1  2  3
      4  5  6  7
      8  9 10 11
      */
      

      在上面的例子中,我使用了一个计数器来初始化数组,但是你可以做不同的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2012-01-26
        • 2013-09-22
        相关资源
        最近更新 更多