我正在做一個使用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中的變量時,它們都具有來自文件的正確房間名稱。但是,主要指向級別的指針不是NULL,而是room_name。我哪裏錯了?任何幫助,將不勝感激:)
從'read_rooms'返回後,您正在存儲一個指向本地堆棧變量'room_name'的指針。在函數返回後訪問它是未定義的行爲。您需要爲新對象的'room_name'字段動態分配內存並複製它。 –
'result-> room_name'是什麼類型?如果它是'char *',那麼你將返回一個指向不再存在的對象的指針,因爲'room_name'(來自'read_rooms')在堆棧上創建,並且在'read_rooms'返回時不再存在。 –