使用指针遍历数组时出现分段错误

时间:2018-09-06 23:51:30

标签: c pointers memory-management segmentation-fault

我有以下代码用于迭代创建的数组。但是,目前有一行显示出细分错误。

#include <stdio.h>

int main(){

  int practice[] = {7, 2, 3, 3, 5};
  int *ip;
  int i = 0;

  *ip = practice[0]; //this is the line giving me problems

  for(; i < 5; ++i){
    printf("%d ", *ip);
    ++ip;
  }

  printf("\n\n");

  return 0;
}

当我将行从*ip = practice[0]更改为ip = &(practice[0])时,我注意到代码突然起作用了。我不确定为什么发生这种情况,因为第一行似乎和第二行一样合理。

2 个答案:

答案 0 :(得分:4)

由于整数指针ip未初始化,因此包含垃圾值。 现在,当您尝试通过*ip对其进行取消引用并尝试为它所指向的内存位置分配一个值时,就会遇到分段错误。

在取消引用指针之前,您应该先分配一个有效地址。

int *ip; 
ip = practice;

答案 1 :(得分:2)

这是怎么回事:

  

* ip =练习[0];

是您要为指针变量分配整数

方括号是C语言访问实际数据的方式,而不是对其的引用。

现在,当您使用&符号(用于获取此数据的内存地址)时,这会将此数据的地址分配给您的变量,这正是您所期望的。 / p>

如果您希望使用指针而不是循环来遍历数组,则可以这样做:

ip = practice;

这会将数组中第一个元素的地址分配给您的 ip 变量,使您可以在循环内对其进行递增。