将内存分配给const char ***变量时出现错误“ realloc():下一个大小无效”

问题描述 投票:0回答:1

我有功能

populateAvailableExtensions(const char** gAvailableExtensions[])

采用指向字符串数组的指针。

我使用malloc(0)将初始内存分配给该阵列。规范说它将返回空指针或可以传递给free()的唯一指针。

  int currentAvailableExtensionCount = 0;

此变量将在gAvailableExtensions中存储字符串数。

在此for循环内

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 currentAvailableExtensionCount =
      sizeof(*gAvailableExtensions) / sizeof(**gAvailableExtensions) - 1;

  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;

在头文件中声明。

我有一个函数populateAvailableExtensions(const char ** gAvailableExtensions []),它使用一个指向字符串数组的指针。我使用malloc(0)将初始内存分配给该数组。规格说...

c memory-management malloc realloc
1个回答
0
投票
int currentAvailableExtensionCount =
     sizeof(*gAvailableExtensions) / sizeof(**gAvailableExtensions) - 1;
© www.soinside.com 2019 - 2024. All rights reserved.