将const char*赋值给const char**后,我有一个错误

将const char*赋值给const char**后,我有一个错误,c,sdl,vulkan,C,Sdl,Vulkan,这是我的代码: 为什么在第sdl\U extensions\U list=&sdl\U extensions行之后;我是否有错误的输出sdl_extension_1=diz?�? 谢谢 通过读取,您需要传递一个指向SDL_Vulkan_GetInstanceExtensions的指针数组,然后函数初始化这些指针 上面文档中的示例还显示,您需要调用SDL_Vulkan_GetInstanceExtensions两次:首先获取元素计数;然后,在创建数组以获取实际列表之后再次执行此操作 在C中,执行此

这是我的代码:

为什么在第sdl\U extensions\U list=&sdl\U extensions行之后;我是否有错误的输出sdl_extension_1=diz?�?

谢谢

通过读取,您需要传递一个指向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]);
}
然后,假设计数为2,则示例中的扩展:

从这两幅图中很容易看出一个主要问题:&sdl_扩展指向一个const char*元素,而扩展指向两个元素的数组

由于SDL_Vulkan_GetInstanceExtensions将参数视为指向包含计数指针的数组的第一个元素的指针,因此您的代码将导致SDL_Vulkan_GetInstanceExtensions写入单元素数组的边界之外,这会导致未定义的行为。

从读取开始,需要传递一个指向SDL\u Vulkan\u 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]);
}
然后,假设计数为2,则示例中的扩展:

从这两幅图中很容易看出一个主要问题:&sdl_扩展指向一个const char*元素,而扩展指向两个元素的数组


由于SDL_Vulkan_GetInstanceExtensions将参数视为指向包含计数指针的数组的第一个元素的指针,因此您的代码将导致SDL_Vulkan_GetInstanceExtensions写入超出单元素数组的边界,从而导致未定义的行为。

谢谢!但我非常感兴趣的是,当我从const char*?@和kot未定义行为中获取地址时会发生什么。问题中显示的代码中的扩展名&sdl_所得到的指针本质上是一个指向仅包含一个元素的数组的第一个元素的指针。谢谢@dude,但以下是我对它的理解。我不明白为什么这是未定义的行为。因为当我通过&sdl_扩展得到一个地址时,我什么也没有改变。@andkot更新了我的答案,希望你能更好地理解其中的区别,以及为什么你的版本是错误的,并导致UB。谢谢!但我非常感兴趣的是,当我从const char*?@和kot未定义行为中获取地址时会发生什么。问题中显示的代码中的扩展名&sdl_所得到的指针本质上是一个指向仅包含一个元素的数组的第一个元素的指针。谢谢@dude,但以下是我对它的理解。我不明白为什么这是未定义的行为。因为当我通过&sdl_扩展得到一个地址时,我什么也没有改变。@andkot更新了我的答案,希望你能更好地理解其中的区别,以及为什么你的版本是错误的,并导致UB。
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]);
}
+-----------------+ +----------------+ | &sdl_extensions | ---> | sdl_extensions | +-----------------+ +----------------+ +------------+ +---------------+---------------+ | extensions | ---> | extensions[0] | extensions[1] | +------------+ +---------------+---------------+