将 const char* 赋值给 const char** 后出现错误
After assignment const char* to const char** I have an error
这是我的代码:
const char* sdl_extensions;
const char** sdl_extensions_list;
if (!SDL_Vulkan_GetInstanceExtensions(p_window, &sdl_extension_count, &sdl_extensions))
{
printf("sdl_extension_count = %i\n", sdl_extension_count);
printf("[ERROR]: SDL_Vulkan_GetInstanceExtensions _2\n");
exit(0);
}
else
{
for(int i = 0; i < sdl_extension_count; i++)
{
printf("sdl_extension_%i = %s\n", i, *(&sdl_extensions + i));
}
sdl_extensions_list = &sdl_extensions;
for(int i = 0; i < sdl_extension_count; i++)
{
printf("sdl_extension_%i = %s\n", i, *(&sdl_extensions + i));
}
}
这里输出:
sdl_extension_count = 2
sdl_extension_0 = VK_KHR_surface
sdl_extension_1 = VK_KHR_xlib_surface
sdl_extension_0 = VK_KHR_surface
sdl_extension_1 = diz?�
为什么在行“sdl_extensions_list = &sdl_extensions;”之后输出错误 (sdl_extension_1 = diz?)?
谢谢!
从阅读 the SDL_Vulkan_GetInstanceExtensions
documentation 开始,您需要传递的是指向 SDL_Vulkan_GetInstanceExtensions
的指针数组,然后函数会初始化这些指针。
上面文档中的例子也说明需要调用SDL_Vulkan_GetInstanceExtensions
两次:首先获取元素个数;然后在创建数组后再次获取实际列表。
在 C 中,执行此操作的代码如下所示:
unsigned int count;
SDL_Vulkan_GetInstanceExtensions(window, &count, NULL);
const char **extensions = malloc(sizeof(const char *) * count);
SDL_Vulkan_GetInstanceExtensions(window, &count, extensions);
for (size_t i = 0; i < count; ++i)
{
printf("Extension %zu: %s\n", i, extensions[i]);
}
[重要说明:错误处理留作 reader]
的练习
记住free
你malloc
的记忆在你完成它之后。
为了解释你的代码中的 &sdl_extensions
和我的例子中的 extensions
之间的区别,让我们把它们画下来看看它们的区别。
首先sdl_extensions
和指针&sdl_extensions
:
+-----------------+ +----------------+
| &sdl_extensions | ---> | sdl_extensions |
+-----------------+ +----------------+
然后 extensions
来自我的示例(假设 count
为 2
):
+------------+ +---------------+---------------+
| extensions | ---> | extensions[0] | extensions[1] |
+------------+ +---------------+---------------+
从这两张图中很容易看出这里的一个主要问题:&sdl_extensions
指向一个单个const char *
“元素”,而extensions
指向一个包含两个个元素的数组。
因为 SDL_Vulkan_GetInstanceExtensions
将参数视为指向包含 count
指针的数组的第一个元素的指针,所以您的代码将导致 SDL_Vulkan_GetInstanceExtensions
超出单-元素“array”,导致 未定义的行为.
这是我的代码:
const char* sdl_extensions;
const char** sdl_extensions_list;
if (!SDL_Vulkan_GetInstanceExtensions(p_window, &sdl_extension_count, &sdl_extensions))
{
printf("sdl_extension_count = %i\n", sdl_extension_count);
printf("[ERROR]: SDL_Vulkan_GetInstanceExtensions _2\n");
exit(0);
}
else
{
for(int i = 0; i < sdl_extension_count; i++)
{
printf("sdl_extension_%i = %s\n", i, *(&sdl_extensions + i));
}
sdl_extensions_list = &sdl_extensions;
for(int i = 0; i < sdl_extension_count; i++)
{
printf("sdl_extension_%i = %s\n", i, *(&sdl_extensions + i));
}
}
这里输出:
sdl_extension_count = 2
sdl_extension_0 = VK_KHR_surface
sdl_extension_1 = VK_KHR_xlib_surface
sdl_extension_0 = VK_KHR_surface
sdl_extension_1 = diz?�
为什么在行“sdl_extensions_list = &sdl_extensions;”之后输出错误 (sdl_extension_1 = diz?)?
谢谢!
从阅读 the SDL_Vulkan_GetInstanceExtensions
documentation 开始,您需要传递的是指向 SDL_Vulkan_GetInstanceExtensions
的指针数组,然后函数会初始化这些指针。
上面文档中的例子也说明需要调用SDL_Vulkan_GetInstanceExtensions
两次:首先获取元素个数;然后在创建数组后再次获取实际列表。
在 C 中,执行此操作的代码如下所示:
unsigned int count;
SDL_Vulkan_GetInstanceExtensions(window, &count, NULL);
const char **extensions = malloc(sizeof(const char *) * count);
SDL_Vulkan_GetInstanceExtensions(window, &count, extensions);
for (size_t i = 0; i < count; ++i)
{
printf("Extension %zu: %s\n", i, extensions[i]);
}
[重要说明:错误处理留作 reader]
的练习记住free
你malloc
的记忆在你完成它之后。
为了解释你的代码中的 &sdl_extensions
和我的例子中的 extensions
之间的区别,让我们把它们画下来看看它们的区别。
首先sdl_extensions
和指针&sdl_extensions
:
+-----------------+ +----------------+ | &sdl_extensions | ---> | sdl_extensions | +-----------------+ +----------------+
然后 extensions
来自我的示例(假设 count
为 2
):
+------------+ +---------------+---------------+ | extensions | ---> | extensions[0] | extensions[1] | +------------+ +---------------+---------------+
从这两张图中很容易看出这里的一个主要问题:&sdl_extensions
指向一个单个const char *
“元素”,而extensions
指向一个包含两个个元素的数组。
因为 SDL_Vulkan_GetInstanceExtensions
将参数视为指向包含 count
指针的数组的第一个元素的指针,所以您的代码将导致 SDL_Vulkan_GetInstanceExtensions
超出单-元素“array”,导致 未定义的行为.