Имеет ли какой-либо адрес в стеке (?) Значение 100?
Прежде всего, calloc
выделяет память в куче, а не в стеке.
Теперь об ошибке.
Конечно, большую часть времени у вас достаточно памяти, когда ваша программа работает.Однако, когда вы выделяете память для x байтов, менеджер памяти ищет какой-то свободный кусок памяти этого точного размера (+ может быть, еще больше, если calloc
запрашивает больший объем памяти для хранения некоторой вспомогательной информации),нет никаких гарантий относительно того, для чего используются байты после этого чанка, и даже нет никаких гарантий, что они не предназначены только для чтения или могут быть доступны вашей программе.
Так что может произойти все что угодно.В случае, если память только что ждала, пока она будет использоваться вашей программой, ничего страшного не произойдет, но если эта память будет использоваться чем-то другим в вашей программе, значения будут испорчены, или хуже всего программа можетсбой из-за доступа к чему-то, к чему не предполагалось получить доступ.
Таким образом, к ошибке valgrind следует относиться очень серьезно.
Язык C не требует проверки границ при доступе к массиву, ибольшинство компиляторов Си не реализуют это.Кроме того, если бы вы использовали переменный размер вместо постоянного значения 3, размер массива мог бы быть неизвестен во время компиляции, и не было бы никакого способа проверить, не ограничен ли доступ.