堆内存的范围

Adi*_*raj 3 c++ memory pointers 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;
}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 9

发生分段错误是因为指针a正在按值传递,因此内部所做的更改A()对调用者不可见,从而导致NULL指针被取消引用B().要更正,请通过引用传递指针A():

void A(int*& x)
Run Code Online (Sandbox Code Playgroud)