我正在使用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是。我哪里错了?任何帮助将不胜感激:))
答案 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;
因为它将超出范围,因此将超出狼群。也许复制一份。
我确信还有其他问题