2014-11-23 41 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