我遇到了一些非常简单的问题,即将数组作为指针传递给函数并返回它们。我以为我有指针,但我无法理解它。
以下是代码:
int* getLottoDraw();
void printArray(int * array);
int find_matches(int * array1, int * array2);
int main(int argc, char *argv[])
{
int * lotteryDraw = getLottoDraw();
printArray(lotteryDraw);
system("PAUSE");
return 0;
}
int* getLottoDraw(){
int draw[6];
int i;
srand(time(NULL));
for (i = 0; i < 6; i++) {
int r = rand() % 49;
draw[i] = r;
}
return draw;
}
void printArray(int *array){
int i;
for (i = 0; i < 6; i++){
printf("%i ", array[i]);
}
}
一个示例输出是“3 2047 4614546 0 25 45”。不是希望的。
答案 0 :(得分:3)
您正在返回堆栈地址,该函数在函数结束时最终被销毁。 堆栈变量是局部变量,它们的范围仅限于它们创建的函数。 它们是在函数上创建的,并在函数结束时被销毁,因此如果您以后尝试访问此地址,您将获得未定义的行为。 您应该有一个动态分配的指针,以便能够在函数外部访问它,或者按值返回,复制内容(在数组的情况下可能代价很高)。
您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int* getLottoDraw();
void printArray(int * array);
int find_matches(int * array1, int * array2);
int main(int argc, char *argv[])
{
int * lotteryDraw = getLottoDraw();
printArray(lotteryDraw);
free(lotteryDraw);
return 0;
}
int* getLottoDraw(){
int* draw = malloc(sizeof(int)*6);
int i;
srand(time(NULL));
for (i = 0; i < 6; i++) {
int r = rand() % 49;
draw[i] = r;
}
return draw;
}
void printArray(int *array){
int i;
for (i = 0; i < 6; i++){
printf("%i ", array[i]);
}
}