2014-05-11 24 views
1

我有這個基本代碼是爲了要求用戶輸入多少個整數,讓用戶輸入每個整數的指定數字,然後重新打印用戶輸入的整數,除了沒有打印整數它只是打印0的基本功能打印0的而不是指定的數字C

int getInts(int * integersArray, int numInput); 

int main() { 
    int * integersArray; 
    int numInput; 
    int i; 

    numInput = getInts(integersArray, numInput); 

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

    return 0; 
} 


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

    printf("Please enter the number of integers 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])); 
    } 

    return numInput; 
} 
+0

這是第一次使用調試器的好機會,在檢查所有相關變量以獲得啓發時,一行一行地逐行執行代碼,真正發生了什麼** - – alk

+0

'0用什麼方式打印出來與用戶輸入的號碼相關? – alk

+0

所以一位老師說「現在我們要學習通過參考」來教你關於它並指定一些作業。也許回顧課堂筆記和關於這個主題的教科書可以讓你學習答案,而不是來這裏快速解決問題。只是說' – Hogan

回答

0

移動這些行:

printf("Please enter the number of integers you want to input\n"); 
scanf("%d", &numInput); 
integersArray = (int *) malloc(sizeof(int) * numInput); 

main,你叫getInts之前。

爲什麼你需要這是getInts接收的integersArray副本(即一個指針的副本),並在getInts分配只修改副本,並在主要的integersArray保持不變的原因。

+1

由於在'getInts()'中讀取'numInput',這是行不通的。 – alk

+0

@alk:更新了我的答案。 – pts

0

首先,您需要了解通過價值傳遞的是什麼,以及通過引用傳遞的是什麼。

在示例中我注意到here,參數是如何在函數中傳遞的。第一個通過價值傳遞,第二個通過引用傳遞。

該函數擁有自己的變量,因爲它有一個內部世界,它的所有變量都在裏面。一旦這個功能被終止,它的世界也是如此。

第一個參數被複制到第一個參數,當函數終止時,函數內部所做的更改被遺忘。

但是,第二個通過引用傳遞。結果函數內部的變量'指向'位於main中的變量。所以,當函數終止時,所有的變化都將在主體的世界中被銘記。

現在,你的情況,你想傳遞一個數組,動態分配它並填充它。 您需要通過引用傳遞數組,以便在函數終止時記住更改。

這裏是一個如何能做到這一點:

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

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

int main() { 
    int * integersArray; 
    int numInput; 
    int i; 

    numInput = getInts(&integersArray, numInput); 

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

    return 0; 
} 

// do I really need to pass numInput, since I return it? No. 
int getInts(int** integersArray, int numInput) { 
    int i; 

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

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

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

    return numInput; 
} 

在這裏,當我們的malloc的東西,這意味着分配的內存不會被當函數結束時取消分配。它將永遠生活,我們應該在我們不再需要它時解除分配,例如在主要結束。如果我們不這樣做,這將產生一個memory leak,這是一個常見的邏輯錯誤。

所以,主要應該修改,以便使用free()

int main() { 
    int * integersArray; 
    int numInput; 
    int i; 

    numInput = getInts(&integersArray, numInput); 

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

    free(integersArray); // FREE 
    return 0; 
} 

下面是一個版本,它不會返回numInput,但修改了一下你getInts()有第二個參數。

// changed the prototype 
void getInts(int** integersArray, int* numInput); 

int main() { 
    int * integersArray; 
    int numInput; 
    int i; 

    getInts(&integersArray, &numInput); // pass the numInput by reference!! 

    for (i = 0; i < numInput; i++) { 
     printf("%d ",integersArray[i]); 
    } 
    free(integersArray); 
    return 0; 
} 


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

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

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

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

請注意numInput是如何在函數體內處理的。 另外請注意,我寫scanf因爲這

scanf("%d", numInput);

但真正發生的事情是這樣的:

scanf("%d", &(*numInput));

然而,運營商&*取消其等了,因爲你可能已經知道。

[編輯]

由於ALK表示,這提供了一個極好的機會,學習使用debugger。有很多關於互聯網的信息和教程。

另一種調試技術將在代碼中使用打印消息,並查看事情不會如你所想的那樣去掉(記住計算機的好處是它們完全按照我們告訴他們的方式進行,計算機就是他們完全按照我們所說的去做)。

下面是修改你的函數用於這一目的的例子:

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

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

    // first step would be to check that you get the numInput right 
    printf("numInput is %d\n", numInput); 


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

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

    // check if you read the numbers correctly 
    for (i = 0; i < numInput; i++) { 
     printf("%d ",integersArray[i]); 
    } 
    printf("\ngetInts() terminating...\n"); 

    return numInput; 
} 

和可能的輸出爲:

Please enter the number of integers you want to input 
1 
numInput is 1 
please enter integer 1: 2 
2 
getInts() terminating... 
441172865 

從我們可以看到,輸入值正確地接收到的輸出我們的數組,因爲我們在函數內部打印數組。

但是,在主要數組中包含垃圾..嗯,有什麼可能是錯的?那麼你已經知道我從前寫過什麼了。你的大腦應該思考,這個功能在她的身體裏確實是很好的工作,但與主要的「溝通」有一些問題。問題是數組沒有被引用傳遞。

另請注意,您不應該施放malloc返回的內容。谷歌更多(搜索結果爲here)。