如何修复C语言中的坏指针

3

我是C语言的初学者,尝试制作一个简单的贪吃蛇游戏时,遇到了指针在另一个函数中使用时值改变的问题。我使用指针来增加我的蛇的长度,使用了3个指针。虽然对于贪吃蛇游戏来说,这可能是一个非常新手的算法,但我觉得我已经接近成功了,但我无法弄清楚出了什么问题。我为蛇本身、每个部分的x坐标和y坐标都使用了3个指针。我不妨发一下我的代码的一部分。

#include<stdio.h>
#include<dos.h>
#include<conio.h>

printer(int *forgoodness,int *y,char *lang,int tx,int ty, int *x)
{
int h=*forgoodness-1,g=0;

这里的值发生了变化,不知何故 x 复制了 y 的 6 个值。

 /* for(;g<15;g++)
{
    printf("%i",x[g]);
}*/
for(;h>=0;h--)
{
    gotoxy(x[h],y[h]);
    printf("%c",lang[h]);
}
    gotoxy(tx,ty);
    printf(" ");
}  


main()
{
int transferx=1,x=1,transfery=1,ch,game=0,dir;
int *transx, *transy, *numel;
int tempsx,g=0,tempsy,forex,j=0,*totalel;
char *snake;
int *snakey, *snakex;

如果我明确赋值,它可以很好地工作,但我不能使用它来让我的蛇变长:

//int snakex[15]={26,27,28,29,30,31,32,33,34,35,36,37,38,39,40};
//int snakey[15]={13,13,13,13,13,13,13,13,13,13,13,13,13,13,13};
clrscr();
*totalel=0;
*numel=14;
forex=26;
snake= "***************";

这是我所做的,我在函数 printer 运行之前检查了这些值,这些值都是正确的。

for(;j<15;j++)
{
    snakey[j]=13;
    snakex[j]=forex;
    *totalel=j;
    forex++;
}


printer(numel,snakey,snake,transferx,transfery,snakex);

我希望你能帮助我完成这个任务。谢谢。


在初始化数组之前,j是否为0?你能给我们你的整个代码吗? - Lidong Guo
嗨,那基本上就是代码了,其余的只是关于使用箭头键移动。是的,j=0是我的数组的第一个索引。 - buzzcarla
还是一样的。:( - buzzcarla
1
你是否为蛇指针“snakex”和“snakey”分配了内存?不清楚你如何尝试让蛇变长。作为建议,也许你应该只创建一个与蛇长度相同的数组,并将其尚未增长的元素设置为-1。 - user2553780
用户2553780问题解决了!我刚刚使用了malloc。非常感谢您提供的这个想法。现在我必须阅读一下它是如何解决我的问题的。不,我不能使用特定大小的数组,因为这会浪费内存,因为我真的不知道我需要多少。干杯。 - buzzcarla
显示剩余3条评论
2个回答

2
也许尝试重写一些代码……最好使用更少的指针。根据我所看到的代码,似乎你正在将值输入随机指针中。这是相当危险的。
例如,连续执行这两行代码是不好的:
int *num;
*num = 9;

原因是因为num只是指向内存的一个指针...而且它目前还没有指向任何有效的东西。数字9试图被存储在一些随机的位置上。您需要为num分配一些内存来指向,或将其指向另一个变量的地址(一个非指针整数)。我觉得您可能还没有完全掌握指针的概念。但不要担心,这需要一点时间。
您应该能够编写您的游戏而不使用任何指针,也许现在只使用一个固定数组就可以了,就像其他人提到的那样。然后再多读一些关于指针工作原理的资料,再尝试一下。我相信您会成功的!
但现在,请尝试用新的数据重新考虑这个问题,并回到我们这里告诉我们您已经做了什么,以便我们可以进一步帮助您。 :)

1
很棒,你正在使用指针编程!但是,正如你所看到的,它们可能有点棘手。你必须记住,指针就像邮箱的地址;它们可以告诉你某物在哪里,但它们本身不能持有任何东西。它们只能指向某些东西。因此,在使用或分配任何指针之前,您声明的每个指针都必须指向实际的东西(例如int或数组元素或数组)。否则,您会将值推入随机的内存区域,从而导致崩溃。这似乎是你遇到的主要问题。
int *ptr;
int value; 
ptr = &value;
*ptr = 10;
// value now is 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接