2015-03-13 34 views
1

我遇到了一些非常簡單的情況:將數組作爲指針傳入函數並返回它們。我以爲我有指點,但我無法理解它。傳遞指針數組並將它們打印出來的問題

下面的代碼:

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」。不是什麼希望。

+2

'getLottoDraw()'返回一個局部變量的地址。使用'int * draw = malloc(6 * sizeof(int));'而不是'int draw [6];'。 – mch 2015-03-13 15:43:22

回答

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]); 
    } 
} 
+0

啊,我真傻,現在完全有道理。非常感謝。 :) – NylePudding 2015-03-13 15:54:01

+0

@NylePudding你知道你可以接受答案嗎? ;)http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – danielfranca 2015-03-22 10:02:50

+0

啊,道歉!我儘量接受答案,只要你給它,但當然它不允許你這麼做。 – NylePudding 2015-03-23 13:59:16