首先,您需要了解通過價值傳遞的是什麼,以及通過引用傳遞的是什麼。
在示例中我注意到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)。
這是第一次使用調試器的好機會,在檢查所有相關變量以獲得啓發時,一行一行地逐行執行代碼,真正發生了什麼** - – alk
'0用什麼方式打印出來與用戶輸入的號碼相關? – alk
所以一位老師說「現在我們要學習通過參考」來教你關於它並指定一些作業。也許回顧課堂筆記和關於這個主題的教科書可以讓你學習答案,而不是來這裏快速解決問題。只是說' – Hogan