LINUX.ORG.RU

История изменений

Исправление 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 */
}