指向指针2d数组的指针数组

时间:2012-10-19 05:23:17

标签: arrays pointers multidimensional-array

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

,但该函数使用索引表示法
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;
}

3 个答案:

答案 0 :(得分:2)

返回的prows值不同。

在这种情况下,

prows被更改:

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

而另一种情况,没有改变prows(仍然是p1):

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

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

答案 1 :(得分:0)

试试这个:

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

return p1;

答案 2 :(得分:0)

我认为二维数组有点复杂。我总是使用一维数组来表示2D数组,例如:

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
*/

在上面的示例中,我使用计数器来初始化数组,但您可以采用不同的方式。