1

私の問題は、整数配列の値が関数calculateに渡されるときに変更されることです。値は、インデックス0、および2->5に対して正しいです。

何らかの理由で、インデックス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;
}

私が間違っていることを知っていますか?

4

3 に答える 3

3

generate_rand()は、ローカル変数arr[0]がどこにあるかへのポインタを返しています。arr関数、が戻るとすぐに、ローカル変数はスコープから外れgenerate_rand()ます。変数がスコープ外になると、その値についての保証はありません。実際、変数のスコープ外にアクセスすることは定義されていません。

考えられる解決策の1つは、ヒープにgenerate_rand()配列を割り当てることです。つまり、を使用してメモリを割り当てることができます。言うまでもなく、メモリは不要になったらすぐに-edする必要があります。arrmalloc()free()

于 2013-01-25T01:39:26.333 に答える
3

問題は、関数のローカル変数のアドレスを返していることです。関数のローカル変数は、関数が終了した後に存在しなくなるため、返されたポインターが突然ぶら下がります(たとえば、有用なものを指していない)。

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);
于 2013-01-25T01:43:21.303 に答える
1

コメントで述べているように、generate_rand()ランダムな値で満たされた配列へのポインタを返す必要があります。現在、ローカル配列の最初の要素へのポインタを返しています。他の人が述べているように、この配列のメモリは、generate_rand()関数内のプログラムでのみ使用可能であることが保証されています。プログラムのどこでも使用できる配列を作成するには、でメモリを割り当てる必要がありますmalloc()。メモリ管理についてさらに調査することをお勧めします。malloc()と関数の両方について学ぶ必要がありfree()ます。

于 2013-01-25T01:43:44.733 に答える