![](/img/trans.png)
[英]program exits when printing global pointer values in the function passed to glutDisplayFunc()
[英]C program: Integer array pointer changes values when passed as parameter
我的问题是我的整数数组的值在传递给函数execute时会改变。 该值对于索引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;
}
你知道我在做什么吗?
generate_rand(
)返回指向arr[0]
的指针,其中arr
是局部变量。 函数generate_rand()
返回后,局部变量将超出范围。 一旦变量超出范围,就不能保证其值,实际上,访问变量超出范围是不确定的。
一种可能的解决方案: generate_rand()
可以在堆上分配数组arr
,即使用malloc()
分配内存。 不用说,一旦不再需要内存就必须是free()
ed。
问题是您要返回函数的局部变量的地址。 函数退出后,函数的局部变量将不复存在,因此返回的指针突然变得悬而未决(例如,没有指向任何有用的东西)。
您需要使用malloc
为数组分配内存,因为从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);
正如您在注释中指出的那样, generate_rand()
需要返回一个指向填充有随机值的数组的指针。 目前,您正在返回一个指向本地数组第一个元素的指针。 正如其他人所述,仅保证该数组的内存可在您的generate_rand()
函数内部供程序使用。 为了创建一个可以在程序中任何地方使用的数组,您需要使用malloc()
分配内存。 我建议您进一步研究内存管理。 您需要了解malloc()
和free()
函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.