我的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)
最佳答案
问题在于:
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> ---> ?????????