我已经开发了这个程序,这是我必须做的单一组合的迷宫。
我遇到了一些指向'path'结构的指针的问题。
我希望能够使用add_path动态更改数组的大小。
但是,运行代码r->paths = malloc(sizeof(path));
时通常无法成功分配内存。以及我也称之为的realloc
。
我是动态分配内存的新手,并且不确定程序是否有内存泄漏。
我也不肯定它应该是malloc(sizeof(path));
或malloc(sizeof(path *));
void add_path(room *r, path newPath, int index)
{
//delclarations
int pathByteSize = sizeof(path);
int fullSize = sizeof(r->paths);
//check size
if(r->paths == NULL)
{
printf("testa");
//if its the first instant, 'malloc' new space
r->paths = malloc(sizeof(path));
if(r->paths == NULL)
{
printf("Failed to save");
return;
}
r->paths[0] = newPath;
printf("testb");
}
else
{
//new size
int newSize;
//if its the second and onwards instant, 'realloc' new space
printf("test1");
path *tempPathArray = (path *)realloc(r->paths, sizeof(path) * index);
printf("test2");
if(tempPathArray == NULL)
{
printf("\nFailed Assigning Memory");
return;
}
else
{
r->paths = tempPathArray;
}
r->paths[index] = newPath;
free(tempPathArray);
}
}
这是整个源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdbool.h>
//TYPE DEFINITIONS
typedef enum
{
NORTH,
EAST,
SOUTH,
WEST,
UNSET
} direction;
typedef char varTitle[50];
typedef struct
{
int indexSource;
int indexDest;
direction direct;
}path;
typedef struct
{
int index;
char desc[50];
char title[50];
path *paths;
}room;
typedef struct
{
char direction[7];
}directionStruct;
//PROCEDURE/FUNCTION DEFINITIONS
directionStruct dir_to_str(direction direct);
void display_room(room *r, room toShow);
room create_room(int tempIndex, char tempTitle[50], char tempDesc[50]);
void create_rooms_and_paths(room *r);
int get_movement(room *r, room currentRoom);
void add_path(room *r, path newPath, int index);
//THE REST
//Read String Function. Used to read in name
char read_char(char prompt[100])
{
printf(prompt);
char a = getchar();
return a;
}
int main()
{
//Delcarations
room r[8];
room currentRoom;
room endOfMaze;
//add rooms and paths
create_rooms_and_paths(&r[0]);
//variables
currentRoom = r[0];
endOfMaze = r[7];
do
{
display_room(r,currentRoom);
int newRoom = get_movement(r,r[0]);
currentRoom = r[newRoom];
} while(currentRoom.index != endOfMaze.index);
printf("\n-YOU FOUND THE EXIT!");
printf("\n-Well done you have completed the game");
printf("\n\n-Credits : ");
printf("\n Code : Gareth Somers");
//set rooms
//do
//{
//display first rooms
// display_room(currentRoom);
// int index = get_movement(currentRoom);
//currentRoom = get_room(index,r);
//}
//while (currentRoom.index != endOfMaze.index);
//you win
}
directionStruct dir_to_str(direction direct)
{
directionStruct temp;
if(direct == NORTH)
{
strcpy(temp.direction,"North");
return temp;
}
else if (direct == EAST)
{
strcpy(temp.direction,"East");
return temp;
}
else if (direct == SOUTH)
{
strcpy(temp.direction,"South");
return temp;
}
else if(direct == WEST)
{
strcpy(temp.direction,"West");
return temp;
}
}
room get_room(room *r, int toFind)
{
//get_room searches for a room and returns it
int i = 0;
for(i = 0; i < sizeof(r); i++)
{
if(r[i].index == toFind)
{
return r[i];
}
}
return;
}
void display_room(room *r, room toShow)
{
//display_room disaplys a room and its paths
//declarations
int i;
//show title
printf("\n\n-%s",toShow.desc);
printf("\n-You may go down the following directions : ");
for (i = 0; i < 2; i++)
{
//this loops through each room and displays its details
char tempString[100] = " ";
sprintf( tempString, " %d. ", (i+1) );
directionStruct tempDirectionStruct = dir_to_str(toShow.paths[i].direct);
strcat(tempString, tempDirectionStruct.direction);
strcat(tempString," to ");
room tempRoom = get_room(r,toShow.paths[i].indexDest);
strcat(tempString,tempRoom.title);
printf("\n%s",tempString);
}
}
room create_room(int tempIndex, char tempTitle[50], char tempDesc[50])
{
//printf("\n Creating %s - %s",tempTitle, tempDesc);
room temp;
temp.index = tempIndex;
strcpy(temp.title, tempTitle);
strcpy(temp.desc, tempDesc);
temp.paths = NULL;
return temp;
}
path create_path(int source, int dest, direction dir)
{
//create tempoary path
path temp;
//assign values
temp.indexSource = source;
temp.indexDest = dest;
temp.direct = dir;
//return path
return temp;
}
void add_path(room *r, path newPath, int index)
{
//delclarations
int pathByteSize = sizeof(path);
int fullSize = sizeof(r->paths);
//check size
if(r->paths == NULL)
{
printf("testa");
//if its the first instant, 'malloc' new space
r->paths = malloc(sizeof(path));
if(r->paths == NULL)
{
printf("Failed to save");
return;
}
r->paths[0] = newPath;
printf("testb");
}
else
{
//new size
int newSize;
//if its the second and onwards instant, 'realloc' new space
printf("test1");
path *tempPathArray = (path *)realloc(r->paths, sizeof(path) * index);
printf("test2");
if(tempPathArray == NULL)
{
printf("\nFailed Assigning Memory");
return;
}
else
{
r->paths = tempPathArray;
}
r->paths[index] = newPath;
free(tempPathArray);
}
//if empty create first spaze
//if not empty realloc space
//check if worked
//copy over contents if did
}
void create_rooms_and_paths(room *r)
{
//Create rooms (Title and Description)
*r = create_room(0,"Room 1", "Welcome to Room 1");
add_path(r,create_path(0,1,EAST),0); add_path(r,create_path(0,2,SOUTH),1);
r++;
*r = create_room(1,"Room 2", "Welcome to Room 2");
add_path(r,create_path(1,0,WEST),0); add_path(r,create_path(1,4,SOUTH),1);
r++;
*r = create_room(2,"Room 3", "Welcome to Room 3");
add_path(r,create_path(2,0,NORTH),0); add_path(r,create_path(2,3,EAST),1); add_path(r,create_path(2,6,SOUTH),2);
r++;
*r = create_room(3,"Room 4", "Welcome to Room 4");
//add_path(r,create_path(3,2,WEST),0); add_path(r,create_path(3,4,EAST),1);
r++;
*r = create_room(4,"Room 5", "Welcome to Room 5");
//add_path(r,create_path(4,1,NORTH),0); add_path(r,create_path(4,3,WEST),1); add_path(r,create_path(4,5,EAST),2);
r++;
*r = create_room(5,"Room 6", "Welcome to Room 6");
//add_path(r,create_path(5,4,WEST),0); add_path(r,create_path(5,7,SOUTH),1);
r++;
*r = create_room(6,"Room 7", "Welcome the end of the maze");
//add_path(r,create_path(6,4,NORTH),0);
}
bool check_movement(room currentRoom, direction direct)
{
//check_movement checks the current room and the directions avaliable to determine if the player can go that direction
int i;
for(i= 0; i < sizeof(currentRoom.paths); i++)
{
if(currentRoom.paths[i].direct == direct)
{
return true;
}
}
return false;
}
int get_path_dest_index(room currentRoom, direction direct)
{
//check_movement checks the current room and the directions avaliable to determine if the player can go that direction
int i;
int dest;
for(i = 0; i < sizeof(currentRoom.paths); i++)
{
printf("\n tester : %i to %i",currentRoom.paths[i].indexSource,currentRoom.paths[i].indexDest);
if(currentRoom.paths[i].direct == direct)
{
dest = currentRoom.paths[i].indexDest;
break;
}
}
return dest;
}
int get_movement(room *r, room currentRoom)
{
//declarations
char input;
direction direct = UNSET;
int i;
bool foundDirection = false;
//loop until direction found (correctly inputed)
while(check_movement(currentRoom, direct) == false)
{
input = NULL;
fflush(stdin);
direct = UNSET;
char prompt[100] = "\n-Please Enter the direction you wish to take (n,e,w,s) : ";
input = read_char(prompt);
//determites direction
if(input == 'n')
{
direct = NORTH;
}
else if(input == 'e')
{
direct = EAST;
}
else if(input == 's')
{
direct = SOUTH;
}
else if(input == 'w')
{
direct = WEST;
}
}
return get_path_dest_index(currentRoom,direct);
}
答案 0 :(得分:1)
重新分配数组时,立即释放它:
path *tempPathArray = (path *)realloc(r->paths, sizeof(path) * index);
/* Other things, including assinging to another pointer */
free(tempPathArray);
当您稍后尝试访问r->paths
时,您可以访问已免费的内存。