Использование realloc для хранения только некоторых значений из вектора - PullRequest
0 голосов
/ 30 июня 2019

Я не могу понять, что происходит.Я написал этот тестовый код, чтобы проверить процедуру, которая мне нужна на другом коде.Я в основном хочу получить указатели только на значения, отличные от нуля в массиве.

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int b[10]={0, 1, 2, 0, 4, 0, 0, 7, 8, 9};
    int *p;
    int i;
    int count=0;

    p=malloc(0) ;

    for (i=0;i<10;i++)
        if (*(b+i)!=0)
        {
            count++;

            realloc(p,count * sizeof(int));

            *(p + count -1) = *(b + i);

            printf("*(p + %d) = %d\n",count-1,*(p + count -1));
        }

    for (i=0;i<count;i++)
        printf("*(p+%d) = %d\n",i,*(p+i));

    return 0;

}

И что происходит, так это то, что при печати внутри первого цикла «for» они печатаются так, как я ожидаю,поэтому 1 2 4 7 8 9, но когда я печатаю эти значения во второй раз, они иногда бывают правильными, иногда первые два числа абсолютно случайны.Это происходит из-за неправильного использования realloc?

1 Ответ

0 голосов
/ 30 июня 2019

Ваш код должен быть таким:

int *new_p = realloc(p, count * sizeof(int));
if (new_p != NULL)
    p = new_p;
else {
  free(p);
  return ENOMEM; //or any error
}

так что вы используете возвращаемое значение realloc и проверяете, что realloc в порядке с нашей утечкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...