2014-05-12 57 views
0

我的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

什麼是你想用做'* numInput'?雙重乘法? NumInput是一個int,而不是一個指針,所以你不能使用它的內容。 – Mawg

+0

@Mawg不正確。該參數是'int * numInput'。 –

+0

對不起,我找到了以前的聲明。我的壞,你的+1。在這種情況下,我建議關注編譯器警告,運行'cppcheck',來自:http://cppcheck.wiki.sourceforge.net/然後在調試器中逐步完成 – Mawg

回答

2

問題是這裏:

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

記住,integersArray指針陣列。換句話說,它是一個指向的指針,指向數組中的第一個元素。

而是嘗試:

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

首先,由於integersArray是一個指向int數組,我取消對它的引用:(*integersArray)

然後,我索引到數組中的i th元素:(*integersArray)[i]

但是,scanf預計它得到的結果的整數地址,我採取這一元素的地址:&(*integersArray)[i]

重要的是要記住的是,您首先必須解除引用integersArray

確認與gcc 4.8.2 i686-pc-cygwin


這裏是應該發生的,而且確實發生(靠運氣!)在第一次循環。

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

然而,在第二次迭代,錯誤的指針被索引,這樣的:

           ______            
integersArray -| <malloc_result> ---> |______| 
       |       |______| 
       |       |______| 
       |       |______| 
       |  
       |-> <malloc_result+4> ---> ????????? 
相關問題