Я пытаюсь создать непрерывный блок памяти в одном вызове функции, который имеет первую часть памяти в виде указательных массивов для других блоков. В основном, я пытаюсь сделать:Смежный блок памяти с malloc
int **CreateInt2D(size_t rows, size_t cols)
{
int **p, **p1, **end;
p = (int **)SafeMalloc(rows * sizeof(int *));
cols *= sizeof(int);
for (end = p + rows, p1 = p; p1 < end; ++p1)
*p1 = (int *)SafeMalloc(cols);
return(p);
}
void *SafeMalloc(size_t size)
{
void *vp;
if ((vp = malloc(size)) == NULL) {
fputs("Out of mem", stderr);
exit(EXIT_FAILURE);
}
return(vp);
}
Но с одним блоком. Это, насколько я получил:
int *Create2D(size_t rows, size_t cols) {
int **memBlock;
int **arrayPtr;
int loopCount;
memBlock = (int **)malloc(rows * sizeof(int *) + rows * cols * sizeof(int));
if (arrayPtr == NULL) {
printf("Failed to allocate space, exiting...");
exit(EXIT_FAILURE);
}
for (loopCount = 1; loopCount <= (int)rows; loopCount++) {
arrayPtr = memBlock + (loopCount * sizeof(int *));
//I don't think this part is right. do I need something like arrayPtr[loopCount] = ....
}
return(memBlock);
}
Я думаю, что получаю ваш ответ, но у меня возникают проблемы с идеей выделения памяти для указателей строк и столбцов. Итак, с этим блоком памяти, cb, вы можете просто приписать часть pmem, чтобы разделить его? Как первая часть, являющаяся указателями на указатели, тогда pcol указывает на указатель последней строки, затем инициализирует cols и имеет указатель на указатели, указывающие на pcol? Что-то вроде того? – Crystal
да. Вы выделяете общее количество, затем используйте указатель math для получения указателя pcol по первому адресу _after_ той части, которую вы хотите назначить для новичков, затем пройдите указатель pcol и используйте его для инициализации массива промахов. конечным результатом является одно выделение, но с тем же расположением, что и исходный код. –
@Crystal: еще раз проверьте код, у меня была ошибка в цикле. Прости. –