2012-10-19 163 views
2

我试图在一个函数调用中创建一个连续的内存块,该函数调用将内存的第一部分作为指针数组指向其他块。该函数使用索引符号虽然我想使用小型指针指针阵列指针2d阵列

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

回答

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。

+0

我仍然得到一个分段错误:11当我使用p1作为返回值。 – blitzeus

+0

我想出来了,每次我递增pcol + = cols,我都改变了for循环的终止部分,因此对于(end = p1 + rows; prows blitzeus

+0

我个人更喜欢索引符号的方式,似乎更容易遵循。 – user1500049

0

试试这个:

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

return p1; 
0

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

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

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