Отладка указателей с помощью Malloc и Free - PullRequest
0 голосов
/ 01 мая 2018

Рассмотрим код ниже:

#include < stdio.h >
#include < stdlib.h >
#define SIZE 10
int main() {
    int * p, i;
    p = malloc(SIZE * sizeof(int));
    if (p == NULL) {
      printf("malloc failed.\n");
      return 1;

    }
    for (i = 0; i < SIZE; i++)
      * (p + i) = i * i;

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

    free(p);

    return 0;
}

Этот код не работает. Однако я не уверен, почему. Мой профессор дал объяснение, которое не имеет большого смысла для меня. Предположительно, функция free не работает.

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

Это правильный способ критиковать этот код?

1 Ответ

0 голосов
/ 01 мая 2018

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

Это правильный способ критиковать этот код?

Да, код не освобождает исходный указатель, выделенный из-за p++, который увеличивает указатель с каждой итерацией цикла.

Вместо этого печать таким способом p не изменяется.

for (i = 0; i < SIZE; i++) {
  // printf("%d\n", * p++);
  printf("%d\n", p[i]);
  // or
  printf("%d\n", * (p + i));
}

// With above change, `p` is the same as the original allocated value.
free(p);
...