В качестве альтернативы joemucchiello,
char **ppMapData = malloc(iMapHeight * sizeof(char*) +
iMapHeight * iMapWidth * sizeof(char)));
for (int i = 0; i < iMapHeight; i++) {
ppMapData[i] = (char *)(ppMapData + iMapHeight) + i * iMapWidth;
/* do something */
}
/* do something */
free(ppMapData);
Это делает одно большое выделение, содержащее как массив указателей, так и массив массивов символов.
Однако, как утверждают многие другие, код, который вы разместили, работает нормально. В сегменте "// do something
" должно быть что-то, что вы не опубликовали, что вызывает эту ошибку.
Например, если вы уже освободили ppMapData[i]
, вы не сможете снова его освободить. Некоторые люди избегают этого, устанавливая ppMapData[i] = NULL
сразу после любого free(ppMapData[i])
: это работает, потому что free(NULL)
является законным и ничего не делает. Я предпочитаю , а не , чтобы сделать это, и исправить любой дизайн, который приведет вас к ситуации с двойным освобождением.