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

时间:2015-03-03 22:04:24

标签: pointers

我知道在解除引用任何指针变量之前它应指向有效的内存位置,否则会发生分段错误,例如此代码示例

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

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

1 个答案:

答案 0 :(得分:1)

当您的程序试图访问它没有权限的内存地址时,会发生分段违规。这可以是:

  • 尚未分配给流程的内存区域
  • 为内核保留的内存区域
  • 内存区域,其保护不包括您尝试的操作(例如,写入只读内存)。

当您尝试取消引用尚未正确初始化的指针时,通常会发生这种情况。除特殊情况外,初始化指针的正确方法是:

  • 取一些其他变量的地址,例如ptr = &var;
  • 在C中分配动态内存:malloc/realloc,在C ++中分配new
  • 从已正确初始化的其他指针变量中分配它。

您还可以添加和减去有效指针以获取新指针。只要您保持指针最初派生自的对象的大小,此指针就会有效。但是,如果你超出这些界限,你可能会或可能不会受到分段违规。大多数情况下,您只是访问内存中的某个相邻对象,导致程序错误而不是信号。

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