到达循环的第二次迭代后的分段错误

时间:2014-05-12 02:31:40

标签: c pointers segmentation-fault

我的C程序在PuTTY中编译并运行良好,直到第二次重复循环。一个拥有相同代码的朋友似乎能够让他的程序工作,我甚至尝试改变我的代码和他的代码之间的任何差异,仍然没有雪茄。下面列出的是代码和执行代码时会发生什么的示例。我认为问题在于malloc声明。

#include<stdlib.h>
#include<stdio.h>


void getInts(int ** integersArray, int * numInput);

int main() {

  int * integersArray;
  int numInput;
  int i;

  getInts(&integersArray, &numInput);

  for (i = 0; i < numInput; i++) {
    printf("number %d = %d\n", i+1, integersArray[i]);
  }

  return 0;
}


void getInts(int ** integersArray, int * numInput) {
  int i;

  printf("Please enter the number of intergers you want to input\n");
  scanf("%d", numInput);

  *integersArray = (int *) malloc(sizeof(int) * *numInput);

  for (i = 0; i < *numInput; i++) {
    printf("please enter integer %d: ", i+1);
    scanf("%d", (integersArray[i]));
  }
}

输出

Please enter the number of intergers you want to input
4
please enter integer 1: 2
please enter integer 2: 3
Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:2)

问题在于:

scanf("%d", (integersArray[i]));

请记住,integersArray是指向数组的指针。换句话说,它是指向指向数组中第一个元素的指针的指针。

而是尝试:

scanf("%d", &(*integersArray)[i]);

首先,由于integersArray是指向int数组的指针,因此我取消引用它:(*integersArray)

然后,我索引到数组中的i元素:(*integersArray)[i]

但是,scanf期望地址得到结果的整数,我取该元素的地址:&(*integersArray)[i]

要记住的重要一点是,必须先取消引用integersArray

使用gcc 4.8.2 i686-pc-cygwin确认。


这里应该发生什么,并且确实在第一次迭代中发生(幸运!)。

                                             ______
integersArray ---> <malloc_result>  --->    |______|
                                            |______|
                                            |______|
                                            |______|

然而,在第二次迭代中,错误的指针被索引,如下所示:

                                             ______                                            
integersArray -|   <malloc_result>  --->    |______|
               |                            |______|
               |                            |______|
               |                            |______|
               |    
               |-> <malloc_result+4>  --->    ?????????