【发布时间】:2020-01-15 13:56:28
【问题描述】:
我有一个函数
populateAvailableExtensions(const char** gAvailableExtensions[], int gCounter)
它将指向字符串数组的指针和数组中元素的数量作为参数。
我使用malloc(0) 为该数组分配初始内存。规范说它将返回一个空指针或一个可以传递给free()的唯一指针。
int currentAvailableExtensionCount = gCounter;
此变量将存储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 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;
在头文件中声明。
编辑 2:更新了代码,现在 gCounter 保存了 gAvailableExtensions 中的元素数量
【问题讨论】:
-
您能否将整个代码粘贴到您的问题中?
-
这不是完整的代码,
availableExtensionProperties是什么?sizeof(availableExtensionProperties[i].name);是什么?I allocate initial memory to that array using malloc(0)不要那样做,只需分配NULL。NULL也可以传递给free。如果您只使用结构而不是三星级程序员,您的设计会更容易。您能否将它们全部发布在一个可编译的代码块中,以便于阅读、复制、扫描和搜索错误? -
@KamilCuk 这是一个结构,问题中的第 6 个代码块。实现类似于
VkExtensionProperties。sizeof(availableExtensionProperties[i].name)应该返回字符串的大小并将其存储在sizeOfAvailableExtensionName变量中。 -
&(*gAvailableExtensions)[currentAvailableExtensionCount]我想你想要(*gAvailableExtensions)[currentAvailableExtensionCount]。还有&availableExtensionProperties[i].name,只是availableExtensionProperties[i].name(以防您稍后将name更改为指针)。不用担心 - 我了解 sizeof 的作用。但是您的帖子被格式化为单独的代码 sn-ps 的方式使我无法阅读。最好发布代码而不是描述代码的作用。我知道“返回”或“复制”是什么,或者代码在 for 中,等等。 -
populateAvailableExtensions()的第一行中的sizeof()没有达到您的预期。两者都将返回指针大小。您不能使用sizeof()来确定作为参数传递的数组的大小,因为它已衰减为指针
标签: c memory-management malloc realloc