2016-04-04 4 views
-1

Я пытаюсь реализовать функцию, предназначенную для броска кубиков определенное количество времени.Как реализовать функцию rollDice() в C?

#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' является ** ** локальная переменная. Возможно, вам стоит потратить одну или две минуты на размышления о последствиях этого прилагательного. – 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

Возможно статическое ключевое слово? Работает ли он на C? –

+0

Я просто добавил код, который вам нужен. Обратите внимание: mallocing и передача назад иногда считается плохой практикой, т. Е. Это может привести к тому, что код трудно читать и должен быть хорошо документирован и т. Д. В этом случае все в порядке. – 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; 
} 
Смежные вопросы