Для правильного вопроса надо знать половину ответа
$? - это статус завершения последней программы.
В C соответствует значению, возвращаемому функцией main. Нормальное завершение программы должно возвращать 0, каждая ошибка обычно соответствует своему коду.
Для правильного вопроса надо знать половину ответа
Указатель на статически определённый массив нельзя изменить.
Вы можете либо определить массив динамически и самостоятельно выделять и освобождать для него память, либо копировать содержимое массива через memcpy/strncpy.
Для правильного вопроса надо знать половину ответа
Размер void стандартом не определён, поэтому поведение операций инкремента/декремента и индекса для указателя типа void* также не определено и зависит от компилятора.
В вашем случае компилятор принял размер void за 1 байт, поэтому v[i] работает с шагом в 1 байт.
ints[i] работает с шагом sizeof(int) байт, то есть 2, 4 или 8 байт, в зависимости от компилятора и целевой системы.
Некоторые компиляторы просто выдадут ошибку при таком использовании указателя с типом void*.
Для правильного вопроса надо знать половину ответа
1. Максимальная длина name зависит от компилятора и системы, под которую будет компилироваться программа. Какой максимальный блок памяти они позволяют выделить, такая и будет максимальная длина (минус 1).
2. Освобождать нужно ту память, которая выделялась динамически. Отдельно элемент name, отдельно саму структуру People. Если память выделялась статически, то и освобождать её не надо.
3. Использование realloc зависит от конкретной реализации. Можно реализовать как с ним, так и без.
Для правильного вопроса надо знать половину ответа
unsigned long - 232-1 = 4'294'967'295
1'073'741'824 * 8 = 8'589'934'592, что больше максимального значения для данного типа.
Используйте unsigned __int64 или unsigned long long, если они есть в вашей системе.
Для правильного вопроса надо знать половину ответа
В том, что вы не удосужились прочитать описание функции fwrite.
Первым параметром должен быть указатель на записываемые данные, вторым - размер единичного элемента данных, а третьим - количество этих элементов.
Для правильного вопроса надо знать половину ответа
//переопределяю массив новыми размерами
a[row][col];
С чего вы сделали такой вывод? Это просто получение значения из массива a по индексам row и col.
Соответственно, массив у вас остаётся размером 1x1 и при записи в несуществующие адреса повреждается стек.
Для правильного вопроса надо знать половину ответа
1. Вы выделили не массив символов, а массив указателей на символы. Соответственно, размер указателя - 8 байт.
2. C не инициализирует память, выделяемую malloc.