Хорошо, пытаясь дать самое простое объяснение сегодня, пытаясь дать вам более подробную картину обо всем этом. Добавим несколько скобок?
(int*) a = 10;
(*a) = 100;
Вы пытаетесь записать четыре байта в диапазон адресов [10-13]. Структура памяти вашей программы обычно начинается выше, поэтому ваше приложение не перезаписывает что-либо случайно, откуда оно могло бы функционировать (например, из .data, .bss и стека). Таким образом, вместо этого просто происходит сбой, поскольку диапазон адресов не был выделен.
Указатель указывает на область памяти, а статическая типизация C определяет тип указателя. Хотя вы можете легко переопределить указатель. Просто:
(void*) v = NULL;
Здесь мы идем дальше к вещам. Что такое нулевой указатель? Это просто указатель, который указывает на адрес 0.
Вы также можете указать тип структуры для вашего указателя:
struct Hello {
int id;
char* name;
};
...
struct Hello* hello_ptr = malloc(sizeof Hello);
hello_ptr->id = 5;
hello_ptr->name = "Cheery";
Хорошо, что такое malloc? Malloc выделяет память и возвращает указатель на выделенную память. Он имеет следующую подпись типа:
void* malloc(size_t size);
Если у вас нет консервативного сборщика мусора, вероятно, ваша память не будет освобождена автоматически. Поэтому, если вы хотите восстановить память из того, что вы только что выделили, вы должны сделать:
free(hello_ptr);
У каждого вашего malloc есть тег размера, поэтому вам не нужно указывать размер чанка, который вы указали для бесплатной процедуры.
Хорошо, еще одно, как выглядит строка символов в памяти? Например, похожий на «Веселый». Простой ответ Это массив байтов с нулевым символом в конце.
0.1.2.3.4.5. 6
C h e e r y \0