离开C中的for循环后在结构数组中丢失值

离开C中的for循环后在结构数组中丢失值,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我已经开始了5天的C编程,我在理解代码中到底发生了什么方面有点困难。我在堆上填充一个房间结构数组,每个房间都有整数值,我在分配空间后立即用用户输入填充。每个房间结构中都有一组生物结构。我用stdin中的int值填充每个房间内的字段,但是在填充这些字段并离开for循环后,这些值似乎会重置,我会在它们的位置上获得随机值,这与我事先在堆上分配内存时的情况类似。我之所以如此困惑,是因为当我用stdin的值填充我的生物_数组时,我几乎是在同一个过程中完成的,一切看起来都很好,这些值可以在我的游戏中需要的地

我已经开始了5天的C编程,我在理解代码中到底发生了什么方面有点困难。我在堆上填充一个房间结构数组,每个房间都有整数值,我在分配空间后立即用用户输入填充。每个房间结构中都有一组生物结构。我用stdin中的int值填充每个房间内的字段,但是在填充这些字段并离开for循环后,这些值似乎会重置,我会在它们的位置上获得随机值,这与我事先在堆上分配内存时的情况类似。我之所以如此困惑,是因为当我用stdin的值填充我的生物_数组时,我几乎是在同一个过程中完成的,一切看起来都很好,这些值可以在我的游戏中需要的地方访问。非常感谢您的帮助,谢谢!我填充房间和生物的代码如下

typedef struct {
   int type;
   int room_number;
   int creat_number;
} creature;

typedef struct {
   struct room *north; //refernce to neighbor
   struct room *south;
   struct room *east;
   struct room *west;
   int n,s,e,w;
   int room_name, state;
   creature creature_array[10];
} room; 

void addCreature(int rm, int t, int cm) {
   int i = 0;
   int f = 0;
  for (; i < 10; i++) {
      if (ptr[rm].creature_array[i].type != 0 && ptr[rm].creature_array[i].type != 1 && ptr[rm].creature_array[i].type !=2) {
         ptr[rm].creature_array[i].creat_number = cm;
         ptr[rm].creature_array[i].type = t;
         ptr[rm].creature_array[i].room_number = rm;
         break;
      } else {
         f++;
         if (f == 9) {
            printf("Room ");
            printf("%d", ptr[rm].room_name);
            printf(" is full.\n");
         }
       }
     }
   }

int main(void) {
   setbuf(stdout, NULL);
   int state, north, south, east, west;
   printf("Welcome!\nHow many rooms?\n");
   int num_r;
   scanf("%d", &num_r);
   ptr = (room *)malloc(num_r * (sizeof (room)));
   int i = 0;
for (; i < num_r; i++) {
      scanf("%d %d %d %d %d", &state, &north, &south, &east, &west);
      ptr[i].room_name=i;
      ptr[i].state = state;
      ptr[i].n=north;
      ptr[i].s=south;
      ptr[i].e=east;
      ptr[i].w=west;
   }
   printf("How many creatures?\n");
   int room_num, type, creat_num;
   int num_of_c;
   scanf("%d", &num_of_c);
   int p = 0;
   int PC_count = 0;
   int creat_count = 0;
 for (; p < num_of_c; p++) {
      creat_num = creat_count++;
      scanf("%d %d", &type, &room_num);
      if (type == 0) {
         PC_count++;
         if (PC_count > 1) {
            printf("Too many PC players\n");
            exit(0);
         }
         addCreature(room_num,type,creat_num);
         pc = &ptr[room_num].creature_array[p];
      } else {
         addCreature(room_num,type,creat_num);
      }
   }
}
typedef结构{
int型;
国际房间号;
int创建_编号;
}生物;
类型定义结构{
结构房间*北;//参考邻居
建筑房*南;
结构室*东;
结构室*西;
国际北、南、东、西;
int room_名称、状态;
生物_阵[10];
}房间;
虚空添加生物(智力rm,智力t,智力cm){
int i=0;
int f=0;
对于(;i<10;i++){
如果(ptr[rm]。生物_数组[i]。类型!=0&&ptr[rm]。生物_数组[i]。类型!=1&&ptr[rm]。生物_数组[i]。类型!=2){
ptr[rm]。生物阵列[i]。创建数量=厘米;
ptr[rm]。生物_阵列[i]。类型=t;
ptr[rm]。生物阵列[i]。房间号=rm;
打破
}否则{
f++;
如果(f==9){
printf(“房间”);
printf(“%d”,ptr[rm]。房间名称);
printf(“已满。\n”);
}
}
}
}
内部主(空){
setbuf(标准输出,空);
州内,北,南,东,西;
printf(“欢迎!\n有多少房间?\n”);
int num_r;
scanf(“%d”&num\r);
ptr=(房间*)malloc(房间大小*);
int i=0;
对于(;i1){
printf(“太多的PC播放器\n”);
出口(0);
}
添加生物(房间数量、类型、创建数量);
pc=&ptr[room_num]。生物_数组[p];
}否则{
添加生物(房间数量、类型、创建数量);
}
}
}
线路

if (ptr[rm].creature_array[i].type != 0||1||2)
相当于:

if (ptr[rm].creature_array[i].type != (0||1||2) )
if (ptr[rm].creature_array[i].type != 1 )
相当于:

if (ptr[rm].creature_array[i].type != (0||1||2) )
if (ptr[rm].creature_array[i].type != 1 )
这就是你想要的吗

我怀疑你想要:

if ( (ptr[rm].creature_array[i].type != 0) &&
     (ptr[rm].creature_array[i].type != 1) &&
     (ptr[rm].creature_array[i].type != 2) )

addbioter()
使用未初始化的
ptr[room\u num]值。bioter\u array

这是否实际编译?在这一行上看起来像是一堆额外的}我看了[可怕的],但它们都排成一行,尽管缩进会有所帮助。(if、else、for、function)。但是,我还没有找到
ptr
的定义,它似乎是全局使用的,但可能应该作为参数传递。我为奇怪的间距道歉。我将指针全局声明为:room*ptr;不必道歉,只需编辑并正确格式化即可。这使得想要帮助你真正理解问题的人变得容易。这也让事情变得更简单。FWIW,这个:
如果(ptr[rm].bioter|u array[i].type!=0 | | 1 | | 2)
看起来可疑。这可能不是你想要的。您可能希望
type
既不是0,也不是1或2。这是错误的表达方式。尝试
if(ptr[rm]。生物_数组[i]。类型!=0&&ptr[rm]。生物_数组[i]。类型!=1&&ptr[rm]。生物_数组[i]。类型!=2)
。但这始终是
true
。你想要
&&
。我想他是说它不是0、1或2,所以应该是:
…type!=0&&…类型!=1&&…类型!=2
@Tordek and Rudy,这很有道理。是的,我会编辑我的作品,我觉得这样可以防止潜在的问题,谢谢!我仍然不明白的是,为什么我的房间结构中的所有字段在我离开循环后都消失了