У меня есть код C++...
// global
DWORD* P;
DWORD (*S)[256];
// then later allocate memory
P = new DWORD[18];
S = new DWORD[4][256];
// later on, free memory
delete P;
delete [] S;
что я хочу конвертировать в C. Я пробовал..
/* global */
DWORD* P;
DWORD (*S)[256];
/* allocate */
P = malloc(sizeof(DWORD[18]));
S = malloc(sizeof(DWORD[4][256]));
/* free */
free(P);
free(S);
Он работает, и я не получаю никаких ошибок или предупреждений от компилятора (GCC), но я не уверен, что это правильный путь, и я предполагаю, что он утечки памяти, возможно, в освобождении многомерного массива.
Кроме того, являются ли эти массивы слишком большими для размещения в стеке? Могу ли я сделать это так и забыть о malloc/free?
DWORD P[18] = {0};
DWORD S[4][256] = {{0}};
Этот код абсолютно безопасен. malloc()
и free()
предназначены только для выделения количества байтов из кучи. Вот почему вы используете sizeof()
внутри вызова для malloc()
, чтобы определить количество байтов, которое требуется для типа данных. Вы также можете, например, сделать S = malloc(sizeof(DWORD) * 4 * 256)
и получить тот же результат.
Чтобы ответить на вторую половину вопроса, ни один из этих массивов не близок к тому, чтобы быть слишком большим для стека. Вы можете складывать их в C или C++.