Vulkan vkCreateInstance-访问冲突写入位置0x0000000000000000
我正试图用Vulkan编写一个基本程序,但我一直遇到运行时错误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函数的参数。我已经尝试了我发现的所有向其他人提出的解决方案,甚至初始化了我相当
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。事实证明