2013-01-25 115 views
1

我的问题是,我的整数数组的值更改时,它传递给函数计算。这些值对于索引0和2-> 5是正确的。C程序:整数数组指针更改值时,作为参数传递

由于某些原因,索引1和6+不是正确的值。

以下是我的代码。

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

int* generate_rand (int length, int MAX_ARRAY); 
void calculate (int *array_ptr, int length, int *mean, int *sd); 

main() { 
    srand(time(NULL)); 
    int a; 
    printf("\nArray length?: "); 
    scanf("%d", &a); 
    int* array_ptr2; 
    array_ptr2 = generate_rand(a, 100); 
    //int mean, sd; 
    int* *mean; 
    int* *sd; 
    int i = 0; 
    for (i = 0; i < 10; i++) { 
     printf("Array2: %d\n", *(array_ptr2 + i)); 
    } 
    calculate(array_ptr2, a, *mean, *sd); 
    //printf("Mean: %d\n", (int)*mean); 
} 

int* generate_rand (int length, int MAX_ARRAY) { 
    int arr[length]; 
    int i; 
    for (i = 0; i < 10; i++) { 
     int r = rand()%MAX_ARRAY; 
     arr[i] = r; 
     printf("Rand: %d\n", arr[i]); 
    } 
    int *arrPtr; 
    arrPtr = &arr[0]; 
    return arrPtr; 
} 

void calculate (int *array_ptr, int length, int *mean, int *sd) { 
    int sum; 
    int i; 
    for (i = 0; i < length; i++) { 
     printf("Array: %d\n", *(array_ptr + i)); 
     sum += *(array_ptr + i); 
     //array_ptr++; 
     printf("Sum: %d, i:%d\n", sum, i); 
    } 
    //*mean = sum/length; 
} 

你知道我在做什么错吗?

+3

generate_rand正在返回一个指向局部变量的内容的指针,这是没用的。 –

+0

所以你说我应该在include语句的下面声明array_ptr2?我刚刚尝试过,我仍然得到相同的结果。 – twbbas

+0

你必须分配你自己的数组(使用'malloc'或'calloc'或其他东西),'generate_rand'中的那个数组在'函数结束时消失'。看起来你已经绕过了关于通过首先将它放入一个临时指针来返回一个局部变量的警告。 – dreamlax

回答

3

问题是你正在返回一个函数的局部变量的地址。函数的局部变量在函数退出后不再存在,所以返回的指针突然变为悬空(因为in,没有指向任何有用的东西)。

您需要为您的阵列malloc分配内存,因为会存在从malloc返回的内存,直到它与free(你可以随时调用之后)被释放。

int* generate_rand (int length, int MAX_ARRAY) { 
    int *arr = malloc(sizeof(int) * length); 

    int i; 

    for (i = 0; i < 10; i++) { 
     int r = rand()%MAX_ARRAY; 
     arr[i] = r; 
     printf("Rand: %d\n", arr[i]); 
    } 

    return arr; 
} 

当你不再需要阵列从这个函数返回的,它传递给free释放内存,如:

int *arr = generate_rand(10, 100); 
// do something with arr here... 
free(arr); 
+0

谢谢!确切地说,我需要和它的工作! – twbbas

3

generate_rand()返回指向arr[0]的指针,其中arr是局部变量。只要函数generate_rand()返回,局部变量就会超出范围。一旦变量超出范围,就不能保证其值,事实上,访问超出范围的变量是未定义的。

一种可能的解决方案:generate_rand()可以在堆上分配阵列arr,即使用malloc()分配存储器。不用说,一旦不再需要,内存必须是free()

1

正如你在评论中陈述,generate_rand()需要返回一个指针到一个用随机值填充的数组。此刻,您正在返回一个指向本地数组的第一个元素的指针。正如其他人所说的那样,该阵列的存储器只能保证在generate_rand()函数内的程序中可用。为了创建一个可以在程序中的任何位置使用的数组,您需要使用malloc()来分配内存。我建议你进一步研究内存管理。您需要了解malloc()free()功能。