Выделение памяти для матрицы с одним Танос


На собеседование, меня попросили написать код выделения памяти для строк*столбцов матрицы, используя один из malloc(). Я хочу, чтобы ваши комментарии про этот код, что я писал:

/*
Allots (in effect) space for a matrix of size rows*cols using a single malloc. 
The whole space allotted consists of an array of size 'rows' of float ptrs,
followed by a float array of size  'rows' * 'cols'. 
The float ptrs 1,2..,  are assigned to row no. 1, 2,..  in the matrix that follows.
*/

float** allotMatrix(const size_t &rows, const size_t &cols)
{
    // Compute size of allotment = rows * cols floats + rows float ptrs
    size_t ptrsize = rows * sizeof(float*);
    size_t datasize = rows * cols * sizeof(float);
    size_t matsize =  ptrsize + datasize;

    // Get if possible a memory allotment  of this size. We use char* for convenience
    char* cmatrix = (char*) malloc(matsize);
    if (cmatrix == NULL)
    {
        fprintf(stderr, "Unable to allot memory");
        exit(1);
    }

    memset((void*) cmatrix, 0, matsize);

    // Assign ptrs to data
    float** ptrstart = (float**) cmatrix;
    float* datastart = (float*) (cmatrix + ptrsize);
    for (size_t i = 0; i != rows; ++i)
    {

        *ptrstart =  datastart;
        // Move to next ptr
        ++ptrstart;
        // .. and move to the next data row
        datastart += cols;
    }

    return (float**) cmatrix;
}


Комментарии
2 ответа

Я бы использовал метода calloc вместо malloc и поскольку ты в любом случае очистка матрицы после распределения.

void* cmatrix = calloc(1, matsize);
...
//memset((void*) cmatrix, 0, matsize); this is not needed anymore because of 'calloc'

Также я не думаю, что есть любой пункт в используя символ* вот так. Похоже, что вы используете char*, так только потому, что она позволяет инкремент указателей на байт. Я думаю, что с помощью поплавка** здесь будет даже более удобно:

float** cmatrix = (float**) calloc(1, matsize);
if (cmatrix == NULL) { ... }
float* datastart = (float*) (cmatrix + rows); // you don't need char pointers here
for (...) { ... }

5
ответ дан 26 марта 2011 в 11:03 Источник Поделиться

Я не прошел бы rows и cols по ссылке в данном случае, в большинстве случаев он будет иметь такой же размер, как указатель, никакой выгоды, используя его в качестве ссылки.

0
ответ дан 28 марта 2011 в 11:03 Источник Поделиться