2

メモリの最初の部分を他のブロックへのポインタ配列として持つ1つの関数呼び出しで、メモリの連続ブロックを作成しようとしています。コンパクトポインタを使用したいのですが、この関数は添字表記で動作します

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;
}
4

3 に答える 3

2

返される船首の値は異なります。

この場合、船首は変更されます。

//  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を返すことです。

于 2012-10-19T05:42:32.593 に答える
0

これを試してください:

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

return p1;
于 2012-10-19T05:58:35.167 に答える
0

二次元配列は少し複雑だと思います。私は常に1次元配列を使用して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
*/

上記の例では、カウンターを使用して配列を初期化しますが、別の方法で行うこともできます。

于 2012-10-19T06:00:13.753 に答える