Vulkan vkCreateInstance-访问冲突写入位置0x0000000000000000

Vulkan vkCreateInstance-访问冲突写入位置0x0000000000000000,c,exception,graphics,vulkan,C,Exception,Graphics,Vulkan,我正试图用Vulkan编写一个基本程序,但我一直遇到运行时错误 Exception thrown at 0x00007FFDC27A8DBE (vulkan-1.dll) in VulkanTest.exe: 0xC0000005: Access violation writing location 0x0000000000000000. 这似乎是一个相对常见的问题,其原因是未能初始化vkCreateInstance函数的参数。我已经尝试了我发现的所有向其他人提出的解决方案,甚至初始化了我相当

我正试图用Vulkan编写一个基本程序,但我一直遇到运行时错误

Exception thrown at 0x00007FFDC27A8DBE (vulkan-1.dll) in VulkanTest.exe: 0xC0000005: Access violation writing location 0x0000000000000000.
这似乎是一个相对常见的问题,其原因是未能初始化vkCreateInstance函数的参数。我已经尝试了我发现的所有向其他人提出的解决方案,甚至初始化了我相当确定不需要的东西,但我仍然无法解决这个问题。该程序是使用MSVC编译器用C编写的

#include "stdio.h"
#include "SDL.h"
#include "vulkan\vulkan.h"
#include "System.h"

int main(int argc, char *argv[])
{
    //Initialize SDL
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        printf("Error");
    }
    printf("Success");

    //Initialize Vulkan
    VkInstance VulkanInstance;

    VkApplicationInfo VulkanApplicationInfo;
    VulkanApplicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    VulkanApplicationInfo.pNext = 0;
    VulkanApplicationInfo.pApplicationName = "VulkanTest";
    VulkanApplicationInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    VulkanApplicationInfo.pEngineName = "VulkanTest";
    VulkanApplicationInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    VulkanApplicationInfo.apiVersion = VK_API_VERSION_1_0;


    VkInstanceCreateInfo VulkanCreateInfo = {0,0,0,0,0,0,0,0};
    VulkanCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    VulkanCreateInfo.pNext = 0;
    VulkanCreateInfo.pApplicationInfo = &VulkanApplicationInfo;
    VulkanCreateInfo.enabledLayerCount = 1;
    VulkanCreateInfo.ppEnabledLayerNames = "VK_LAYER_KHRONOS_validation";
    vkEnumerateInstanceExtensionProperties(0, VulkanCreateInfo.enabledExtensionCount,             
    VulkanCreateInfo.ppEnabledExtensionNames);

    //Create Vulkan Instance
    if(vkCreateInstance(&VulkanCreateInfo, 0, &VulkanInstance) != VK_SUCCESS)
    {
        printf("Vulkan instance was not created");
    }

    //Create SDL Window
    SDL_Window* window;
    window = SDL_CreateWindow("VulkanTest", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 0, 0, SDL_WINDOW_VULKAN || SDL_WINDOW_FULLSCREEN_DESKTOP);

    SDL_Delay(10000);
    return 0;
}
#包括“stdio.h”
#包括“SDL.h”
#包括“vulkan\vulkan.h”
#包括“System.h”
int main(int argc,char*argv[])
{
//初始化SDL
if(SDL_Init(SDL_Init_EVERYTHING)<0)
{
printf(“错误”);
}
printf(“成功”);
//初始化Vulkan
VkInstance Vulkan实例;
VkApplicationInfo VulkanApplicationInfo;
VulkanApplicationInfo.sType=VK_结构_类型_应用_信息;
VulkanApplicationInfo.pNext=0;
VulkanApplicationInfo.pApplicationName=“VulkanTest”;
VulkanApplicationInfo.applicationVersion=VK_MAKE_VERSION(1,0,0);
VulkanApplicationInfo.pEngineName=“VulkanTest”;
VulkanApplicationInfo.engineVersion=VK\u MAKE\u版本(1,0,0);
VulkanApplicationInfo.apiVersion=VK_API_VERSION_1_0;
VkInstanceCreateInfo VulkanCreateInfo={0,0,0,0,0,0};
VulkanCreateInfo.sType=VK_结构_类型_实例_创建_信息;
VulkanCreateInfo.pNext=0;
VulkanCreateInfo.pApplicationInfo=&VulkanApplicationInfo;
VulkanCreateInfo.enabledLayerCount=1;
VulkanCreateInfo.ppEnabledLayerNames=“VK_LAYER_KHRONOS_validation”;
vkEnumerateInstanceExtensionProperties(0,VulkanCreateInfo.enabledExtensionCount,
VulkanCreateInfo.ppEnabledExtensionNames);
//创建Vulkan实例
if(vkCreateInstance(&VulkanCreateInfo,0,&VulkanInstance)!=VK_成功)
{
printf(“未创建Vulkan实例”);
}
//创建SDL窗口
SDL_窗口*窗口;
window=SDL_CreateWindow(“VulkanTest”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,0,0,SDL_window_VULKAN | SDL_window_全屏桌面);
SDL_延迟(10000);
返回0;
}

您确定调用
vkCreateInstance()
会导致崩溃吗?我没有试着调试您显示的代码(这是您的工作),但只要看看代码正在进行的调用,应该是对
vkEnumerateInstanceExtensionProperties()
的调用崩溃了(如果它甚至编译了!)

vkEnumerateInstanceExtensionProperties()
的第二个参数需要一个
uint32\u t*
指针,但您正在传递一个已初始化为0的
uint32\u t
值(
VulkanCreateInfo.enabledExtensionCount
)。因此,这将使
pPropertyCount
参数成为空指针(如果它甚至可以编译)

您正在第三个参数中传递
VulkanCreateInfo.ppEnabledExtensionNames
(如果该参数已编译),并且
ppEnabledExtensionNames
已初始化为NULL。根据vkEnumerateInstanceExtensionProperties()的

如果
pProperties
为空,则在
pPropertyCount
中返回可用的扩展属性数。否则,
pPropertyCount
必须指向用户设置的变量,该变量对应于
pProperties
数组中的元素数,返回时,该变量将被实际写入
pProperties
的结构数覆盖

由于
pPropertCount
为空,
vkEnumerateInstanceExtensionProperties()
无处写入属性计数!如果试图写入地址0x0000000000000000,则肯定会导致访问冲突

该文档清除了以下状态:

pPropertyCount
必须是指向
uint32\t
值的有效指针

除此之外,对
vkEnumerateInstanceExtensionProperties()
的调用在逻辑上是错误的,因为第三个参数需要指向
VkExtensionProperties
结构数组的指针,但是,
VulkanCreateInfo.ppEnabledExtensionNames
是指向
const char*
UTF-8字符串数组的指针

换句话说,您不应该使用
vkEnumerateInstanceExtensionProperties()
来初始化调用
vkCreateInstance()
的条件。您完全误用了
vkEnumerateInstanceExtensionProperties()
。您可能打算改为使用,例如:

uint32\u t ExtensionCount=0;
if(!SDL_Vulkan_GetInstanceExtensions(NULL,&ExtensionCount,NULL))
{
...
}
常量字符**扩展名=(常量字符**)SDL_malloc(sizeof(常量字符*)*ExtensionCount);
如果(!扩展名)
{
...
}
if(!SDL_Vulkan_GetInstanceExtensions(NULL,&ExtensionCount,ExtensionNames))
{
SDL_free(扩展名);
...
}
VulkanCreateInfo.enabledExtensionCount=ExtensionCount;
VulkanCreateInfo.ppEnabledExtensionNames=扩展名;
if(vkCreateInstance(&VulkanCreateInfo,0,&VulkanInstance)!=VK_成功)
{
...
}
SDL_free(扩展名);
...

确认存在空指针。你忘记初始化什么了吗?在调试器中逐步查找该指针应表示的内容。请使用您正在使用的语言进行标记。不要在C问题上敲C++,它是C++库。我认为这可能是相关的。哪一个空指针?我相信有几个。这是C代码。标记问题的可见部分。考虑:有人在看标签试图回答C++问题,将寻找C++代码。<代码> PNABABLE LIELDENS =“VKJ-Layer-KurnOSoSuffic”< /C>。这是怎么回事?似乎是一个类型错误。一个是
char*
另一个是
char**
。我正在使用该教程的部分内容,但使用的是SDL2而不是GLFW。事实证明