将 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]

的练习

记住freemalloc的记忆在你完成它之后。


为了解释你的代码中的 &sdl_extensions 和我的例子中的 extensions 之间的区别,让我们把它们画下来看看它们的区别。

首先sdl_extensions和指针&sdl_extensions:

+-----------------+      +----------------+
| &sdl_extensions | ---> | sdl_extensions |
+-----------------+      +----------------+

然后 extensions 来自我的示例(假设 count2):

+------------+      +---------------+---------------+
| extensions | ---> | extensions[0] | extensions[1] |
+------------+      +---------------+---------------+

从这两张图中很容易看出这里的一个主要问题:&sdl_extensions指向一个单个const char *“元素”,而extensions指向一个包含两个个元素的数组。

因为 SDL_Vulkan_GetInstanceExtensions 将参数视为指向包含 count 指针的数组的第一个元素的指针,所以您的代码将导致 SDL_Vulkan_GetInstanceExtensions 超出单-元素“array”,导致 未定义的行为.