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]wherearr是局部变量的指针。一旦函数generate_rand(), 返回,局部变量就会超出范围。一旦变量超出范围,就无法保证它的值,事实上,访问超出范围的变量是未定义的。

一种可能的解决方案:可以在堆上generate_rand()分配数组,即使用. 不用说,一旦不再需要内存,就必须立即对其进行编辑。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 回答