c++ - 这个函数如何改变堆栈上声明的变量的值?

标签 c++ memory segmentation-fault memory-address vulkan

我目前正在学习使用 Vulkan API 进行一些编程。这就是该 API 中的典型调用方式。如果您不熟悉它的含义,请不要担心太多。

pickPhysicalDevices(){
    uint32_t deviceCount = 0;
    vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
}

基本上,vkEnumeratePhysicalDevices 函数返回系统可用的物理设备的数量,并将该值放入 deviceCount 中。我的问题是,既然我在 pickPhysicalDevices() 函数堆栈上声明了 deviceCount,为什么 vkEnumeratePhysicalDevices 不会导致段错误?

最佳答案

简短的回答是因为 pickPhysicalDevices 明确允许 vkEnumeratePhysicalDevices 通过提供指针修改 deviceCount 变量。

C++ 提供了多种方法让一个函数修改另一个函数上下文中的值 - 通过传递指针或传递引用。

您传递的是指针还是引用,取决于您调用的函数的声明。如果一个函数接受 uint32_t&(带有一个 & 符号),那么你传递一个没有 & 符号的变量,并且该函数接收一个引用。如果一个函数采用 uint32_t*(带有星号),那么您可以使用寻址运算符 & 将指针传递给该变量。

一旦进入接受指针的函数,您可以编写 *pointer = ... 为指针指向的变量分配一个新值。另一方面,引用不需要星号。

在一个简单的程序中尝试这两种方法:

void by_ref(uint32_t& ref) {
    ref = 123; // No asterisk
}
void by_ptr(uint32_t* ptr) {
    *ptr = 456; // Note the asterisk
}
int main() {
    uint32_t a, b;
    by_ref(a);
    by_ptr(&b);
    cout << a << " " << b << endl;
}

关于c++ - 这个函数如何改变堆栈上声明的变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50979602/

相关文章:

c# - 是否可以跟踪分配/解除分配?

c++ - 调用 TTF_OpenFont 时出现奇怪的段错误

带有 strncmp 的 Linux 上的 C 段错误

c++ - 外部链接变量多次初始化

c - 用指针访问零位

java - 内存管理递归Java

c++ - 访问函数的段错误

c++ - 从 x64 进程获取另一个进程的 32 位 PEB

c++ - C++ 中的容器和运算符

c++ - 带动画的 QStateMachine 事件循环