История изменений
Исправление intelfx, (текущая версия) :
Вот пример кода, который это иллюстрирует. Его полезно запустить под отладчиком в режиме трассировки и посмотреть значения всех переменных после каждой строчки.
void f()
{
char line[10]; /* на стеке выделилось 10 байт, line -- адрес первого байта из них; в самих 10 байтах -- мусор */
char *p; /* на стеке выделилось 4 или 8 байт под абстрактрый адрес чего-нибудь; в этих байтах сейчас мусор */
strcpy(line, "test"); /* первые 5 байт из тех десяти теперь равны 't', 'e', 's', 't' и нулю */
p = malloc(5); /* переменная p теперь содержит не мусор, а адрес нового куска памяти размером в 5 байт (выделенного операционной системой откуда-то) */
strcpy(p, line); /* теперь в тех пяти байтах, что мы выделили malloc()'ом (и адрес которых лежит в переменной p) не мусор, а те же самые символы 't', 'e', 's', 't', 0 */
}
Исходная версия intelfx, :
Вот пример кода, который это иллюстрирует. Его полезно запустить под отладчиком в режиме трассировки и посмотреть значения всех переменных после каждой строчки.
А вот с *p
всё по-другому. char *p
— это указатель, т. е. переменная, которая хранит адрес. Ты делаешь alloc()
, т. е. запрашиваешь у ОС новый свободный кусок памяти (не на стеке, а где-то там) и присваиваешь адрес его начала переменной p
.
void f()
{
char line[10]; /* на стеке выделилось 10 байт, line -- адрес первого байта из них; в самих 10 байтах -- мусор */
char *p; /* на стеке выделилось 4 или 8 байт под абстрактрый адрес чего-нибудь; в этих байтах сейчас мусор */
strcpy(line, "test"); /* первые 5 байт из тех десяти теперь равны 't', 'e', 's', 't' и нулю */
p = malloc(5); /* переменная p теперь содержит не мусор, а адрес нового куска памяти размером в 5 байт (выделенного операционной системой откуда-то) */
strcpy(p, line); /* теперь в тех пяти байтах, что мы выделили malloc()'ом (и адрес которых лежит в переменной p) не мусор, а те же самые символы 't', 'e', 's', 't', 0 */
}