for循环

时间:2018-04-22 22:37:55

标签: c for-loop random segmentation-fault

我是C编程的新手,只是将它带到了大学的必修课程,并最终完成了本周的最终项目。

问题是我每次运行此代码时都会收到一条错误消息“分段错误:11”,我不确定这意味着什么。

该代码应该运行双人比赛。每个玩家都有一个预先确定的“速度修正器”,也就是0-9的数字。生成1-10的随机数;如果速度修改器+随机数不超过10,则添加速度修改器并且汽车移动“空间”的总量。整个赛道是90“空间”。

每次运行此代码时,它都会稍微好一点(稍后会更多)进行一次或两次迭代,然后发出该错误消息。我通常不会要求在线提供作业帮助,但老实说我很困惑。任何帮助都会受到超级赞赏。

以下是相关代码:

种族(主要)功能:

int race(struct car cars[4], int mode)
{
/* Define variables. */
int endgame, i, x, y, first=-1, second=-1, randnum, spaces[]={};
char input[100];
/* Declare pointer. */
int *spacesptr=spaces;

for (i=0; i<mode; i++)
{
    /* Array spaces will keep track of how many spaces a car has moved. Start each car at 0. */
    spaces[i]=0;
}

/* Clear screen before race. */
system("cls");

/* Print message to indicate race has started. */
printf("\n3...\n2...\n1...\nGO!\n\n");

/* Open do while loop to keep race running until it is over. */
do
{
    /* Conditions for two player mode. */
    if (mode==2)
    {
        /* Run the next block of code once for each player. */
        for (i=0; i<mode; i++)
        {
            /* Generate random integer from 1-10 to determine how many spaces the car moves. */
            x=10, y=1;
            randnum=(getrandom(x, y));
            spaces[i]=spaces[i]+randnum;

            /* Call function speedmod to determine if speedmodifier should be added. */
            speedmod(cars, spaces, randnum);

            /* Rank players. */
            if (spaces[i]>89)
            {
                if (first==-1)
                {
                    first=i;
                }

                else if (second==-1)
                {
                    second=i;
                }

            }

        }
    }

    ...

    /* Call function displayrace to display the race. */
    displayrace(cars, spaces, mode);

    /* Call function endgame to determine if the race is still going. */
    endgame=fendgame(mode, spaces);

    if (endgame==0)
    {
        /* Ask for player input. */
        printf("Enter any key to continue the race:\n");
        scanf("%s", input);

        /* Clear screen before loop restarts. */
        system("cls");
    }

} while (endgame==0);
}

随机数函数:

int getrandom(int x, int y)
{
/* Define variable. */
int randnum;

/* Use time seed. */
srand(time(0));

/* Generate random numbers. */
randnum=(rand()+y) % (x+1);

return randnum;
}

添加速度修改器功能:

void speedmod(struct car cars[4], int spaces [], int go)
{
/* Declare pointer. */
int *spacesptr=spaces;

/* If the number of spaces plus the speed modifier is less than or equal to ten... */
if (spaces[go]+cars[go].speedmod<=10)
{
    /* ...add the speed modifier to the number of spaces moved. */
    spaces[go]=spaces[go]+cars[go].speedmod;
}
}

显示竞赛功能:

void displayrace(struct car cars[4], int spaces[], int mode)
{
/* Define variables. */
int i, j;

/* Declare pointers. */
int *spacesptr=spaces;
struct car *carsptr=cars;

/* Open for loop. */
for (i=0; i<mode; i++)
{
    /* Print racecar number. */
    printf("#%d\t", cars[i].carnumber);

    /* For every space the car has moved... */
    for (j=0; j<spaces[i]; j++)
    {
        if (j<=90)
        {
            /* ...print one asterisk. */
            printf("*");
        }
    }

    /* New line. */
    printf("\n");
}
}

结束游戏功能:

int fendgame(int mode, int spaces[])
{
/* Define variables. */
int racers=0, endgame=0, i;
/* Declare pointer. */
int *spacesptr=spaces;

/* Open for loop. */
for (i=0; i<mode; i++)
{
    /* If any of the racers have not yet crossed the finish line (90 spaces)... */
    if (spaces[i]<=90)
    {
        /* ...then add to the number of racers still in the game. */
        racers++;
    }
}

/* If all the racers have crossed the finish line... */
if (racers==0)
{
    /* ...then end the game. */
    endgame=1;
}

return endgame;
}

现在更具体地讨论这个问题......它在竞赛功能中的“for”循环中某处搞乱了。由于某种原因,它实际上并没有经历“i”的每次迭代,特别是在这一行中:

spaces[i]=spaces[i]+randnum;

我知道这是因为我输入了printf语句来显示之前和之后的space [i]的值;我的第一次迭代工作正常...但第二次迭代实际上使用空格[i-1]而是将randnum添加到该值?

然后,就像我说的那样,它在一两次之后就会崩溃......: - (

我知道这很多但是我希望有人比我能发现这段代码中的错误更有经验!请帮忙!

4 个答案:

答案 0 :(得分:1)

我相信上面的第一个用户说错误是因为没有为数组声明初始大小,但解决方案不正确。您必须使用malloc动态分配其大小。

另外,我将spaces[i]=spaces[i]+randnum简化为spaces[i] += randnum

答案 1 :(得分:0)

关于:问题是我每次运行此代码时都会收到一条错误消息,说明&#34;分段错误:11&#34;而且我不确定这意味着什么。

这意味着您的程序正在尝试访问应用程序不拥有的内存。

例如,一个狂野的&#39;指针或未初始化的指针或写入数组的末尾。

答案 2 :(得分:0)

感谢您的帮助。在对这段代码进行了大量的修补之后,我终于找到了问题。

我正在将randnum传递给speedmod函数,就好像它是数组spaces的索引一样。我将函数更改为以下内容,其中num是生成的随机数,go是索引:

void speedmod(struct car cars[4], int spaces [], int num, int go)
{
    /* Declare pointer. */
    int *spacesptr=spaces;

/* If the number of spaces plus the speed modifier is less than or equal to ten... */
if (num+cars[go].speedmod<=10)
{
    /* ...add the speed modifier to the number of spaces moved. */
    spaces[go]+=cars[go].speedmod;
}
}

现在完美运作。再次感谢您的帮助。

答案 3 :(得分:-1)

你声明spaces[]={},所以它分配一个指向任何东西的ptr。然后你开始写它,它可能会破坏你的堆栈,你的其他变量,以及其他任何东西 - &gt;未定义的行为。

你需要在使用它之前提供要写入的内存,例如spaces[1000]={},不管你需要多少。