2013-01-25 47 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()功能。