我尝试实现一个用于掷骰子一定时间的功能。
#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 :(得分: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;
}
答案 1 :(得分: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;
}