Перераспределение памяти - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Если писать такой код
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int *p = NULL, count = 0;
    
    do
    {
        p = realloc(p, (++count)*sizeof(int));//в этом месте
        
        if(p!=NULL)
        {
            scanf("%d", &p[count-1]);
            
            for(int i = 0; i<count; i++)
                printf("%d ", p[i]);
            
            //count++;
        }
    }
    while(p[count-1]!=-1);
    
    return 0;
}
в указанном месте произойдет утечка памяти? Например если realloc вернет мне NULL тогда p=NULL, и, как я думаю, этот участок памяти потеряется. Если переписать код так
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int *p = NULL, *t=NULL, count = 0;
    
    do
    {
        t = realloc(p, (++count)*sizeof(int));
        
        if(t!=NULL)
        {
            free(p);//здесь если перераспределение памяти произошло, без изменения адреса, то освобождается нужные при работе данные, наверное, поэтому данный код не работает.
            p=t;
            t=NULL;
            
            scanf("%d", &p[count-1]);
            
            for(int i = 0; i<count; i++)
                printf("%d ", p[i]);
            
            //count++;
        }
    }
    while(p[count-1]!=-1);
    
    return 0;
}
то в таком случае программа падает. Так как же мне поступить, чтобы не было утечек памяти. И еще вопрос. Если при перераспределении памяти адрес изменится, то что произойдет со старым адресом, она освобождается или его нужно освободить?

Решение задачи: «Перераспределение памяти»

textual
Листинг программы
if (t!=p) ...

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы