这是我的代码:
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 ?.)?
谢谢!
从阅读的SDL_Vulkan_GetInstanceExtensions
文档,你需要传递的是指针数组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]);
}
[重要说明:错误处理留给读者练习]
完成操作后,请记住您free
的记忆malloc
。
为了说明&sdl_extensions
您的代码和extensions
我的示例之间的区别,请绘制它们并查看它们的区别。
首先sdl_extensions
和指针&sdl_extensions
:
+ ----------------- + + ---------------- + | &sdl_extensions | ---> | sdl_extensions | + ----------------- + + ---------------- +
然后extensions
从我的示例中(假设count
为2
):
+ ------------ + + --------------- + --------------- + | 扩展| ---> | 扩展[0] | 扩展[1] | + ------------ + + --------------- + --------------- +
从这两个图像中,很容易看到一个主要问题:&sdl_extensions
指向单个 const char *
“元素”,而extensions
指向两个元素的数组。
因为SDL_Vulkan_GetInstanceExtensions
将自变量视为指向包含count
指针的数组的第一个元素的指针,所以您的代码将导致SDL_Vulkan_GetInstanceExtensions
写出单元素“数组”的边界,从而导致未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句