Карта программ в памяти может быть организована, например: (текст + данные + bss)
Эта карта создается во время компиляции и остается постоянной во время выполнения, ваша программа может расширяться в незанятую часть виртуальной памяти во время выполнения при использовании динамического выделения памяти malloc ().
Ваша программа:
1- Во время выполнения он выделяет 3 сегмента памяти в памяти (HEAP).
2- p инициализируется функцией malloc с адресом NNNN в куче. Это местоположение первого набора из 3 выделенных сегментов.
Первый адрес (p + 0 * (sizeof (игрок))), второй набор будет в (p + 1 * (sizeof (игрок))) и третий адрес в (p + 2 * (sizeof (игрок))).
С C вы можете попытаться получить доступ куда угодно, но вам нужно установить механизмы безопасности, чтобы не повредить ваш код, ваши данные или некоторую незащищенную зону.
Пример механизма безопасности в этом случае: используйте numPlayers * sizeof вместо константы «3» в 3 * sizeof или проверьте ввод пользователя.
Таким образом, любой доступ на чтение / запись к p [15] будет направлен на (p + 15 * (sizeof (player))).
3- Почему он заселен?
Память может содержать другие данные из вашей программы или просто шум. Вот что заполняет ваши поля структуры.
4- Почему это случайный сбой?
Ваш доступ на запись приведет к повреждению данных, но это может быть не достаточно плохо для сбоя. Если вы войдете в память в направлении сегмента ТЕКСТ. Вы испортите свой код и обязательно потерпите крах.