Я нахожусь на кривой обучения указателя и действительно могу использовать какое-то направление/помощь. Я хочу иметь массив структур, причем каждая структура является «ячейкой», которая отслеживает различные вещи. Все, кажется, работает нормально, не компилирует ошибки или что-то еще, и я использую массив для создания карты. Проблема возникает, когда я пытаюсь получить доступ к массиву в разных точках. Иногда я получаю нарушение доступа к памяти, иногда я этого не делаю - это значит, что мне повезет. Я очень новичок в C, поэтому любая помощь приветствуется - или указывая в правильном направлении. Я действительно хочу понять, почему и где я ошибся, и у меня такое чувство, что это мои указатели и память - я правильно передаю вещи? Заранее спасибо.Нарушение памяти, доступ к массиву структур
#define ysize 20
#define xsize 80
typedef struct cells {
int type;
bool visited;
bool passable;
int item;
} cells;
int getCell(int x, int y, struct cells **map)
{
return map[x + xsize * y]->type;
}
void setCell(int x, int y, int celltype, struct cells **map)
{
map[x + xsize * y]->type = celltype;
}
struct cells **makeMap()
{
struct cells **map = malloc(xsize * ysize * sizeof(struct cells *));
for (int i = 0; i != xsize * ysize; i++) {
map[i] = malloc(sizeof(struct cells));
map[i]->type = 0;
map[i]->item = 0;
map[i]->passable = true;
map[i]->visited = false;
}
return map;
}
void main()
{
struct cells ** map = makeMap();
//getRand generates a random number between the min and max supplied.
int x = getRand(0, xsize);
int y = getRand(0, ysize);
if (getCell(x, y, map) == tileCorridor || getCell(x, y, map) == tileDirtFloor){
//map[x + xsize * y]->item = 3;
//printf("%d", getCell(x, y, map));
}
// this is where the code is failing.
//sometimes it works, others it generates a memory error
destroyMap(map);
}
каких значения х, у: опубликовать [Minimal, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – Thomas
'void main()''int main()' – stackptrВы, кажется, путаетесь, хотите ли вы 1-мерную карту, где вы вычисляете индекс 'struct' из его координат или 2- D, где у вас есть 1-D массив указателей на другие 1-D массивы 'struct'. В первом случае вам не нужны 2 звезды (если вы не хотите устанавливать указатель через аргумент функции вместо возвращаемого значения функции). –