2016-04-04 19 views
-1

私はサイコロを一定の時間量だけ回転させる機能を実装しようとしています。CでrollDice()関数を実装する方法を教えてください。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int * rollDice(int len) //len = times the dice is rolled. 
{ 
    int ints[len]; 

    int i = len-1; 


    while(i>0) 
    { 

     ints[i--] = (rand()%6)+1; 

    } 

    return ints; 
} 


int main(int argc, const char * argv[]) 
{ 


    int * ints = rollDice(10); 

    for(int i =0; i<10; i+=1) 
    { 
     printf("%d ",*(ints+i)); 
    } 
    return 0; 
} 

プログラムは常にこれを表示しますが、ポインタの私の考えは間違っていますか?

104 0 0 0 1919706998 2036950640 1667723631 1836545636 16 48 
+0

'ints'が** **ローカル変数です。おそらく、あなたはこの形容詞の意味を考えるのに1〜2分を費やすべきです。 – Olaf

答えて

2

あなたはそれがスタック上で宣言されます。この

return ints; 

を行うことはできません。あなたは十分なメモリでそれを渡すか、またはmallocを使って関数内のメモリを割り当てて戻す必要があります。

int * rollDice(int len) //len = times the dice is rolled. 
{ 
    int *ints = malloc(sizeof(int) * len); 
    int i = len-1; 
    while(i>0) 
    { 
     ints[i--] = (rand()%6)+1; 
    } 
    return ints; 
} 
+0

私はmallocすべきですか? – Aleks

+0

staticキーワードですか?それはCで動作しますか? –

+0

必要なコードを追加しました。注意して、元に戻したり戻したりすることは、悪い習慣とみなされることがあります。つまり、読みにくく、文書化が必要なコードにつながる可能性があります。この場合は問題ありません。 – Harry

0

ハリーの答えは正しい。ローカル変数のアドレスを返すことはできません。その変数は、関数が返るとすぐに破棄されます。

だけではなく機能に充填される配列を渡し、関数にメモリを割り当てる有する:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define NUM_DICE 10 

void rollDice(int *dice, int num_dice) 
{ 
    int i; 

    for (i = 0; i < num_dice; i++) { 
     dice[i] = (rand() % 6) + 1; 
    } 
} 


int main(int argc, const char * argv[]) 
{ 
    int dice[NUM_DICE]; 

    srand(time());  /* Don't forget this! */ 

    rollDice(&dice, NUM_DICE); 

    for(int i = 0; i < NUM_DICE; i++) 
    { 
     printf("%d ", dice[i]); /* Easier to use brackets than pointer arithmetic. */ 
    } 

    return 0; 
} 
関連する問題