Вопросы о небольшой программе выделения памяти (41 строка) - PullRequest
0 голосов
/ 13 января 2020

Вопросы

  1. Сохраняет ли "массив хранения памяти" allocbuf [10] все подряд. Например, allocbuf [10] заполнен {F, i, r, s, t, \ 0, S, e, c, \ 0], и я сообщу, как allocbuf заполнился. Я представляю, как вся информация, которую я сохраняю в allocbuf, сохраняется спина к спине. Так, например, после использования allo c (6) и присвоения возвращаемого символьного указателя переменной char * first , символьный указатель "first" указывает на allocbuf [0]. Теперь я назначаю first = "First"; Если я хочу напечатать «First», нужно ли использовать a для l oop, for (i = 0; i < 6; i++) { print allocbuf[i]; }, чтобы распечатать «First»?

  2. Если я назначу first = allo c (1), а затем присвойте first = "First", это сработает и перезапишет содержимое allocbuf, верно?

  3. Почему строка printf("allocbuf: %s\n", allocbuf); не распечатывает содержание allocbuf в моем коде?

Я уверен, что меня заинтересуют дополнительные возможности этой программы, и я рад вашей помощи.

I Я рад прочитать любые комментарии об этой программе, функциях и распределении памяти, хотя они могут не отвечать на определенные c вопросы, которые у меня есть. Поэтому, пожалуйста, поделитесь своими знаниями и опытом со мной. Спасибо:)

PS Я не встречал mallo c () в моей книге, K & R C Программирование 2-е издание, но, пожалуйста, никаких комментариев, говорящих об использовании mallo c ().

Код

char *alloc(int); //return pointer to free storage in allocbuf[10]
void afree(int *); //free storage in allocbuf[10]
void strcpy2(char *, char *); //copy to, from
static char allocbuf[10];
static char* allocp = allocbuf;

main()
{
    char array4[5] = "4444";
    char* cp = "overwritten";
    char* copy = array4;
    char* occupyalloc;

    printf("cp: %s\n", cp); //"overwritten"
    printf("copy: %s\n", copy); //"4444"

    cp = "2"; //overwrite *cp = "overwritten" with *cp = "2"
    printf("cp: %s\n", cp); //"2"

    occupyalloc = alloc(4); //returns allocp 0, intended storage space is allocbuf[0] through allocbuf[3]

    cp = alloc(3); //returns allocp 4, intended use is allocbuf[4] through allocbuf[6]

    strcpy2(cp, copy); //copies "4444" into *cp, specifically allocbuf[4] through allocbuf[7]

    printf("cp: %s\n", cp); //"4444" , stored in allocbuf[4] through allocbuf[7] improperly
    printf("allocbuf: %s\n", allocbuf); //prints allocbuf -- not working
}

char *alloc(int n)
{
    if (allocbuf + ALLOCSIZE - allocp >= n) 
    {
        allocp += n;
        return allocp - n;
    }
    else
        return 0;
}

void afree(int *initial_storage_element_location)
{
    if (initial_storage_element_location >= allocbuf && initial_storage_element_location < allocbuf + ALLOCSIZE) 
        allocp = initial_storage_element_location;
}

void strcpy2(char *s, char *t)
{
    while (*s++ = *t++)
            ;
}

1 Ответ

0 голосов
/ 13 января 2020

Вы должны понимать, что если у вас есть строка как cp = "2", то

  • Компилятор создает строковый литерал как "2".
  • Этот строковый литерал обычно хранится в ячейке памяти, доступной только для чтения.
  • Адрес строкового литерала хранится в указателе cp

Теперь, если вы используете динамическое выделение памяти c как

 char *first = alloc(6);
 first = "First";

Что происходит в первом операторе, так это то, что память выделяется из буфера * stati c allocbuf, а адрес выделенной памяти сохраняется в first. Со вторым оператором вы перезаписываете указатель first местоположением в постоянной памяти. Таким образом, вы теряете ранее выделенный указатель, и у вас утечка памяти

Если вы используете alloc, вы должны скопировать данные First в память с помощью strcpy

strcpy(first, "First")

Если я назначу first = allo c (1), а затем назначу first = "First", это сработает и перезапишет содержимое allocbuf, верно?

Нет, вы не перезаписываете содержимое allocbuf, но используете новый указатель для чтения только памяти.

Почему строка printf ("allocbuf:% s \ n", allocbuf) ; не распечатывать содержимое allocbuf в моем коде?

Я отвечу на это в контексте опубликованного кода.

occupyalloc = alloc(4); //returns allocp 0, intended storage space is allocbuf[0] through allocbuf[3]
cp = alloc(3); //returns allocp 4, intended use is allocbuf[4] through allocbuf[6]
strcpy2(cp, copy); //copies "4444" into *cp, specifically allocbuf[4] through allocbuf[7] 

printf ("cp:% s \ n", cp); // "4444", хранится в allocbuf [4] через allocbuf [7] неправильно printf ("allocbuf:% s \ n", allocbuf); // печатает allocbuf - не работает

В этом случае allocbuf[0] будет \0, так как вы не изменяете occupyalloc переменную.

Обратите внимание, что "4444" требует 5 байтов, и вы назначаете только 3 байта.

...