Pointers 指针变量如何指向有效的内存位置?

Pointers 指针变量如何指向有效的内存位置?,pointers,Pointers,我知道在取消引用任何指针变量之前,它应该指向有效的内存位置,否则就会出现分段错误,如下面的代码示例 int *ptr = 10; int y = *ptr; 我的问题是什么是分段错误以及如何避免它?当您的程序试图访问其无权访问的内存地址时,会发生分段冲突。这可以是: 尚未分配给进程的内存区域 保留给内核使用的内存区域 其保护不包括您尝试的操作的内存区域(例如,写入只读内存) 这通常发生在您尝试取消引用尚未正确初始化的指针时。除特殊情况外,初始化指针的正确方法有: 获取其他变量的地址,例

我知道在取消引用任何指针变量之前,它应该指向有效的内存位置,否则就会出现分段错误,如下面的代码示例

int *ptr = 10;
int y = *ptr; 

我的问题是什么是分段错误以及如何避免它?

当您的程序试图访问其无权访问的内存地址时,会发生分段冲突。这可以是:

  • 尚未分配给进程的内存区域
  • 保留给内核使用的内存区域
  • 其保护不包括您尝试的操作的内存区域(例如,写入只读内存)
这通常发生在您尝试取消引用尚未正确初始化的指针时。除特殊情况外,初始化指针的正确方法有:

  • 获取其他变量的地址,例如
    ptr=&var
  • 分配动态内存:C中的
    malloc/realloc
    ,C中的
    new
    ++
  • 从其他已正确初始化的指针变量赋值
您还可以对有效指针进行加减以获得新指针。只要您保持在最初派生指针的对象的大小范围内,此指针就有效。但是,如果超出这些界限,可能会或可能不会出现分段冲突。大多数情况下,您只需访问内存中的某个相邻对象,这会导致程序错误,但不会产生信号


从整数初始化指针,例如
int ptr=10,没有定义的行为,但在大多数实现中,它只是尝试使用此虚拟内存地址。由于大多数操作系统对内核使用编号较低的地址,这通常会导致分段冲突错误。

该代码根本无法编译。
分段错误的含义是什么
您正在访问您现在拥有的内存段(或完全无效)<代码>如何避免它
不要执行示例中的操作。不能保证取消引用无效指针会导致segfault。。通过正确初始化指针避免分段错误。此外,在使用
gcc
时,请始终使用所有警告进行编译,
-Wall
,并修复所有问题。永远不要忽略编译器警告。只是为了帮助您在将来获得此网站上的帮助。