我的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)
答案 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> ---> ?????????