замена памяти в C? - PullRequest
       15

замена памяти в C?

1 голос
/ 04 мая 2011

люди, у меня был вопрос относительно вещей в памяти в C

см. Следующий код:

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

char *tesaja(char *data)
{
        char *tmp = (char*)malloc(sizeof(char) * strlen(data));
        tmp = data;
        return tmp;
}

int main()
{
//area 1
char *wew = tesaja("budipergikepasar");
printf("nilai wew : %s\n",wew);

//area 2
wew = tesaja("kepasarbudisedangpergi");
printf("nilai wew : %s\n",wew);

return 0;
}

и показывает вывод, как показано ниже:

nilai wew : budipergikepasar
nilai wew : kepasarbudisedangpergi

и единственный вопрос, который у меня возник, память в области 1 будет автоматически освобождена и заменена новой?

спасибо заранее

Ответы [ 5 ]

7 голосов
/ 04 мая 2011

Строка "tmp = data" не делает то, что вы думаете. В C строки копируются с использованием strcpy (). C-строки - это массивы элементов char. Эта строка устанавливает переменную tmp в значение переменной data, а не копирует символы, как вы думаете.

В результате вы теряете единственную ссылку на память, выделенную функцией malloc (), и вызываете утечку памяти.

1 голос
/ 04 мая 2011

Держись. Подумайте о замене:

char *tmp = (char*)malloc(sizeof(char) * strlen(data));
tmp = data;
return tmp;

с:

char *tmp;
tmp = (char*)malloc(sizeof(char) * strlen(data));
if (tmp == NULL) {Do some error handling because you are out of heap memory};
strcpy(tmp,data);
return tmp;

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

способ написания вашего кода

char *wew = tesaja("budipergikepasar");
.
.
.
wew = tesaja("kepasarbudisedangpergi");

Юо "потеряет контроль" того, где tesaja ("budipergikepasar") находится в оперативной памяти кучи, когда wew перезаписывается вторым вызовом tesaja. После этого у вас возникнет «утечка памяти», поскольку у вас больше нет указателя на блок оперативной памяти, содержащий «budipergikepasar», и вы не сможете вызывать free () с местоположением «budipergikepasar». Подумайте об использовании своего кода следующим образом:

if (wew != NULL) {
   free(wew);
   }

wew = tesaja("budipergikepasar");
.
.
.
if (wew != NULL) {
   free(wew);
   }
wew = tesaja("kepasarbudisedangpergi");

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

надеюсь, это поможет -

Perry

0 голосов
/ 04 мая 2011

Прямо сейчас вы выделяете место для tmp, но затем вы переключаете ссылку на tmp на значение data. Вместо этого ваш код должен использовать strcpy, чтобы избежать утечек памяти:

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

char *tesaja(char *data)
{
        char *tmp = (char*)malloc(sizeof(char) * strlen(data));
        tmp = strcpy(tmp, data);
        return tmp;
}

int main()
{
   //area 1
   char *wew = tesaja("budipergikepasar");
   printf("nilai wew : %s\n",wew);

   //area 2
   wew = tesaja("kepasarbudisedangpergi");
   printf("nilai wew : %s\n",wew);

   return 0;
}
0 голосов
/ 04 мая 2011

Эта программа полностью неверна.

tmp = data просто назначает статическую последовательность символов, объявленную в main для tmp, и пропускает выделенную память.

Что вы хотите выполнить?

0 голосов
/ 04 мая 2011

- память в области 1 будет автоматически освобождена

Нет.Звоните бесплатно ()

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