маленькая c программа basic.turning указатель - PullRequest
1 голос
/ 10 июля 2011

Я всегда имею в виду это сомнение. Пожалуйста, смотрите ниже программу:

#include <stdio.h>
char * function1(void);
int main()
{
    char *ch;
    ch = function1();
    printf("hello");
    free(ch);
    return 0;
}

char* function1()
{
    char *temp;
    temp = (char *)malloc(sizeof(char)*10);
    return temp;
}

у меня утечка памяти? программа не падает в ideone с некоторыми предупреждениями:

prog.c: In function ‘main’:
prog.c:11: warning: implicit declaration of function ‘free’
prog.c:11: warning: incompatible implicit declaration of built-in function ‘free’
prog.c: In function ‘function1’:
prog.c:19: warning: implicit declaration of function ‘malloc’
prog.c:19: warning: incompatible implicit declaration of built-in function ‘malloc’

и печатает привет.

Я только начинающий в C. Так что, пожалуйста, помогите мне понять, что происходит после оператора return в function1.does free действительно освобождает память, выделенную в funtion1?

Ответы [ 4 ]

7 голосов
/ 10 июля 2011

утечка памяти

Вы - код, который не пропускает никакой памяти, потому что вы делаете free(ch);, что free выделяет память malloc внутри функции function1. Вы можете проверить это, напечатав адреса указателей, т.е.

char* function1()
{
  char *temp;
  temp=(char *)malloc(sizeof(char)*10);
  printf("temp: %p\n", temp);
  return temp;
}

и

ch = function1();
printf("ch: %p\n", ch);

Вы должны увидеть, что оба отпечатка (ch и temp) будут печатать по одному и тому же адресу. Таким образом, free(ch); будет free правильным malloc ed фрагментом памяти.

Вы также можете использовать valgrind , чтобы проверить, не выделен ли ваш код free выделенной памяти.

О предупреждениях

Функции free, malloc определены в stdlib.h.

Добавьте это в свой код:

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

Кроме того, не очень хорошая идея приводить malloc возвращаемое значение temp=(char *)malloc(...);. Прочитайте здесь .

2 голосов
/ 10 июля 2011

Вам нужно включить stdlib.h, чтобы использовать free и malloc.

Просто не имеет значения, что на самом деле free и malloc делает в вашем коде выше, так что все равноработы.

0 голосов
/ 10 июля 2011

Предлагаемая альтернатива:

#include <stdio.h>
#include <malloc.h>

char * function1(void);

int
main(int argc, char *argv[])
{
  char *ch = function1();
  if (!ch)
    printf("ERROR: Unable to allocate memory!\n");
  else
  {
    printf("Allocation successful.\n");
    free(ch);
  }
  return 0;
}

char*
function1()
{
  return (char *)malloc(10);
}

Компиляция:

gcc -Wall -pedantic -o x x.c (где «x.c» - исходный файл, а «x» - .exe)

0 голосов
/ 10 июля 2011

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

Включите stdlib.h, поскольку он содержит определение для malloc.

Кроме того, если вы пользуетесь бесплатным, вы не теряете память

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