Распределение памяти в C, использование Realloc - PullRequest
0 голосов
/ 20 ноября 2018

Как использовать функцию realloc для calloc здесь. пожалуйста, руководство? первый ввод функции calloc дает мне правильный вывод, но после использования функции realloc мой компилятор только что застрял, какую ошибку я здесь делаю? ВЫДАЕТСЯ:

    #include<stdio.h>
#include<stdlib.h>
int main()
{
    int n,n2,sum=0,i;
    int *ptr,*p;
    printf("Enter Totoal Number of elements:");
    scanf("%d",&n);
    ptr=(int*)calloc(n,sizeof(int));
    for(i=0;i<n;i++)
    {
        printf("Enter %d Element:",i+1);
        scanf("%d",ptr+i);
        sum=sum+*(ptr+i);
    }
    printf("The sum is: %d\n",sum);
    printf("Enter new size:");
    scanf("%d",&n2);
    p=(int *)realloc(ptr,n2*sizeof(int));
    for(i=0;i<n2;i++)
    sum=sum+*(p+i);
    printf("The new sum is:%d",sum);

    free(ptr);
    free(p);
}

ВЫХОД ЗДЕСЬ

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы просто не сбрасываете sum в ноль.

printf("Enter new size:");
scanf("%d",&n2);
p=(int *)realloc(ptr,n2*sizeof(int));

for(i=0;i<n2;i++)
   sum=sum+*(p+i);

printf("The new sum is:%d",sum);

Прежде чем запрашивать новый размер, вы уже суммировали записи n.Затем вы добавляете к этому первые n2 записи.Если вы хотите связать только записи n2, просто установите sum=0; перед повторным добавлением.

Также вы нарушите код, если n2 > n, поскольку вы не предоставите новые значения для новых записей.

Другая ошибка:

free(ptr);
free(p);

Вы не можете использовать ptr после того, как вы позвонили realloc.Возможно, он был бы свободен уже в realloc, если нужно было переместить ячейку памяти.Тогда эта память уже не твоя.Или это может быть то же самое, что и p, тогда вы попытаетесь освободить одну и ту же память дважды.Оба не являются хорошими идеями.

0 голосов
/ 20 ноября 2018

Редактировать после обновления: вы дважды освобождаете один и тот же указатель.

free(ptr);
free(p);

Согласно man realloc: realloc возвращает указатель, переданный в качестве аргумента, поэтому ptr и p одинаковы.На самом деле вам здесь не нужны два указателя.

Если вы хотите инициализировать, вместо этого пройдите ptr или p, что, как я полагаю, вы пытаетесь сделать тогда:

 for(i=0;i<10*sizeof(int);i++)

Вы циклически 10 * sizeof(int) раз просматриваете массив размером 10, доступ к *(ptr+i) аналогичен обращению к ptr[i], ptr+i оценивает адрес ptr + sizeof(*p), вы можете прочитать об арифметике указателей, если хотитеучить больше.

В вашем случае вы выходите за пределы вашей выделенной памяти, потому что ваш динамически распределенный массив имеет размер 10.

...