У меня есть функция
populateAvailableExtensions(const char** gAvailableExtensions[], int gCounter)
, которая принимает указатель на массив строк и количество элементов в массиве в качестве параметров.
Я выделяю начальная память для этого массива, используя malloc(0)
. Спецификации говорят, что он вернет либо нулевой указатель, либо уникальный указатель, который можно передать в free()
.
int currentAvailableExtensionCount = gCounter;
Эта переменная будет хранить номер строки в gAvailableExtensions
.
Внутри этого for
l oop
for (int i = 0; i < availableExtensionCount; ++i)
у меня есть этот фрагмент кода
size_t sizeOfAvailableExtensionName =
sizeof(availableExtensionProperties[i].name);
reallocStatus = realloc(*gAvailableExtensions, sizeOfAvailableExtensionName);
memcpy(&(*gAvailableExtensions)[currentAvailableExtensionCount],
&availableExtensionProperties[i].name,
sizeOfAvailableExtensionName);
++currentAvailableExtensionCount;
, где
availableExtensionProperties[i].name
возвращает строку.
Вот как определяется struct
typedef struct Stuff {
char name[MAX_POSSIBLE_NAME];
...
...
} Stuff;
realloc(*gAvailableExtensions, sizeOfAvailableExtensionName);
должно добавить память размером sizeOfAvailableExtensionName
к *gAvailableExtensions
массиву без ссылок.
memcpy(&(*gAvailableExtensions)[currentAvailableExtensionCount],
&availableExtensionProperties[i].name,
sizeOfAvailableExtensionName);
следует скопировать строку (это sizeOfAvailableExtensionName
много памяти) из
&availableExtensionPropterties[i].name
адреса в
&(*gAvailableExtensions)[currentAvailableExtensionCount]
адреса.
Но я не не думаю, что код делает то, что я думаю, потому что я получаю эту ошибку
realloc(): invalid next size
Aborted
(core dumped) ./Executable
РЕДАКТИРОВАТЬ: Полный код
uint32_t populateAvailableExtensions(const char** gAvailableExtensions[], int gCounter) {
int currentAvailableExtensionCount = gCounter;
void* reallocStatus;
uint32_t availableExtensionCount = 0;
vkEnumerateInstanceExtensionProperties(
VK_NULL_HANDLE, &availableExtensionCount, VK_NULL_HANDLE);
VkExtensionProperties availableExtensionProperties[availableExtensionCount];
vkEnumerateInstanceExtensionProperties(
VK_NULL_HANDLE, &availableExtensionCount, availableExtensionProperties);
for (int i = 0; i < availableExtensionCount; ++i) {
size_t sizeOfAvailableExtensionName =
sizeof(availableExtensionProperties[i].extensionName);
reallocStatus = realloc(*gAvailableExtensions, sizeOfAvailableExtensionName);
memcpy(&(*gAvailableExtensions)[currentAvailableExtensionCount],
availableExtensionProperties[i].extensionName,
sizeOfAvailableExtensionName);
++currentAvailableExtensionCount;
}
return currentAvailableExtensionCount;
}
Это то, как вызывает внешняя функция для этого в заголовочном файле объявлено
uint32_t availableExtensionCount = 0;
availableExtensions = malloc(0);
availableExtensionCount = populateAvailableExtensions(&availableExtensions);
и
const char** availableExtensions;
.
EDIT 2: обновлен код, теперь gCounter
содержит число элементы в gAvailableExtensions