我正在尝试在一个函数调用中创建一个连续的内存块,该函数调用将内存的第一部分作为指向其他块的指针数组。虽然我想使用紧凑指针
,但该函数使用索引表示法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;
}
答案 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
*/
在上面的示例中,我使用计数器来初始化数组,但您可以采用不同的方式。