c++ - 堆内存的范围

标签 c++ pointers memory memory-management

据我所知,堆在本质上应该是全局的,不是吗?所以我们应该能够在函数中的任何地方访问堆内存。那为什么下面的代码会出现段错误(Segmentation Fault)呢?

#include <stdio.h>
using namespace std;

void A(int* x)
{
  x = new int[10];
  for(int i = 0; i< 10; i++)
  {
    x[i] = i;
  }
}

void B(int *x)
{
  printf("%d", x[8]);
}

int main()
{
  int* a = NULL;
  A(a);
  B(a);
  return 0;
}

最佳答案

发生段错误是因为指针 a 正在按值传递,所以在 A() 中所做的更改对调用者不可见,从而导致 NULL 指针在 B() 中被解除引用。要更正,请通过引用将指针传递给 A():

void A(int*& x)

关于c++ - 堆内存的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23250284/

相关文章:

c - 无限循环和指针

c - malloc 与 C 中的数组

c - memfrob函数的设计与使用

c++ - 将sys_time类型另存为二进制

c++ - 在 C++ 中从 main() 调用的函数

c++ - 如何在 Google 测试中将 FRIEND_TEST 与 TYPED_TEST 结合使用?

c - C 中的动态内存分配 : why do I get an error?

c++ - 将指针转换为指针……指向指针?

c - 结构体、指针、通过指针获取字段值

c++ - 验证取自 std::cin 的 char * 的长度