C函数返回错误数据

时间:2014-02-22 17:20:39

标签: c

我正在使用C制作游戏,我有一个函数读取文件并返回一个指针来保存关卡的数据。

文件:levelbuilder.c

bunker *read_rooms(char *rooms_file){
   FILE *bunker_file = fopen(rooms_file, "r");
   char room_name[MAX_ROOM_NAME_LEN];
   fscanf(bunker_file, "%s", room_name);
   bunker *result = create_bunker(room_name);
   fclose(bunker_file);
   return result;
}

显然对,它没有完成整个关卡,因为我还在测试一下。我将在下面列出create_bunker。

档案:room.c

bunker *create_bunker(char *room_name){
   bunker *result = malloc(sizeof(bunker));
   result->room_name = room_name;
   for (int i = 0; i < MAX_ITEMS; i++) {
       result->items[i] = NULL;
   }
   result->connected_to = NULL;
   result->next = NULL;
   return result;
}

此功能正常。

当我使用调试器检查read_rooms中的变量时,它们都具有来自文件的正确房间名称。但是,在main中,指向该级别的指针不是NULL,而是它的room_name是。我哪里错了?任何帮助将不胜感激:))

4 个答案:

答案 0 :(得分:2)

变量room_name是函数read_rooms中的本地数组。

因此,它指向堆栈上的一块内存。

只要你在函数“内部”,该内存的内容才有效。

一旦你“退出”,你就不能再依赖这段内存来包含有效数据了。

它可能包含您期望的数据,但可能不包含。

即使它确实如此,也可能在程序执行的稍后时间被覆盖。

因此,您应该复制实际内容而不是设置result->room_name = room_name

result->room_name = malloc(strlen(room_name)+1);
strcpy(result->room_name,room_name);

当然,在free(result->room_name) ...

之前不要忘记free(result)

答案 1 :(得分:0)

更改此行:

result-&gt; room_name = room_name;

对于

strcpy(result-&gt; room_name,room_name);

要复制result-&gt; room_name中room_name的内容。正如你现在所做的那样,你正在制作一个char *指针分配,这将使程序疯狂。

答案 2 :(得分:0)

您在堆栈上分配room_name,而不是将ponter传递给它,并保存到result->room_name。您不能依赖堆栈上保存的值(没有malloc或其他东西创建),它会在函数执行完成后很快被覆盖。正如Hernan Velasquez建议的那样使用strcpy

答案 3 :(得分:0)

首先,这一行是错误的

 result->room_name = room_name;

因为它将超出范围,因此将超出狼群。也许复制一份。

我确信还有其他问题