2014-11-23 43 views
2

基本上,它爲什麼不只是打印輸入的整數。現在它只是打印垃圾值,但我不知道爲什麼它不能訪問離開函數後存儲的值。它似乎只有在離開getIntegersFromUser函數後纔會搞砸。如果我在getIntegers函數中運行for循環,它會正確執行,但爲什麼不在主函數中?爲什麼我無法訪問存儲在另一個函數中的值?

在此先感謝您的幫助。

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

void getIntegersFromUser(int N, int *userAnswers) 
{ 
    int i; 
    userAnswers =(int *)malloc(N*sizeof(int)); 
    if (userAnswers) 
     { printf("Please enter %d integers\n", N); 
      for (i=0;i<N; i++) 
      scanf("%d", (userAnswers+i)); 
     } 
} 
int main() 
{ 
    int i, M=5; 
    int *p; 
    getIntegersFromUser(M, p); 
    for (i=0;i<5;i++) 
     printf ("%d\n", p[i]); 

    return 0; 
} 

此外,這是一個家庭作業的問題,但它是一個「加分題」,所以我不試圖「欺騙」我只是想確保我瞭解所有的課程材料,但如果你能仍然試圖給出一個相當徹底的解釋,以便我可以真正瞭解那些令人敬畏的東西。

+1

提示:*完成你開始*。如果你有'malloc',你應該也有'free'。在大多數情況下,強烈建議在同一個函數中使用'malloc'和'free'。當然,在你調用'free'之後,你不應該訪問內存。有了這個提示,你可能會找到一種方法來解決你的問題,通過優雅的方式通過值傳遞指針。 – 2014-11-23 18:44:38

+1

請注意,函數參數是LOCAL變量。 – Anonymous 2014-11-23 18:47:05

回答

0

指針按值傳遞。該函數正在使用指針的副本,該指針在函數結束時被丟棄。來電者從未看到此副本。

要修復它,你可以返回指針。

int *getIntegersFromUser(int N) 
{ 
    int *userAnswers = malloc(...); 
    ... 
    return userAnswers; 
} 

/* caller: */ 
int *p = getIntegersFromUser(M); 

或者,你可以通過引用,以便作用於同一個指針,而不是複製功能通過您的指針。

void getIntegersFromUser(int N, int **userAnswers) 
{ 
    *userAnswers = (int *) malloc(N*sizeof(int)); 
    ... 
} 

/* caller: */ 
int *p; 
getIntegersFromUser(N, &p); 
+1

兩者仍然是不好的風格。該函數執行分配並將其留給調用者,只能驚歎於如何執行釋放(特別是當數組內容不是基本類型時)。接受一個指向數組的指針和它的大小作爲參數。將分配留給被調用者。 – pmr 2014-11-23 18:55:49

相關問題