内存替换在C?

时间:2011-05-04 17:56:30

标签: c memory malloc

伙计们我对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 个答案:

答案 0 :(得分:7)

“tmp = data”这一行没有按照你的想法行事。在C中,使用strcpy()复制字符串。 C字符串是char元素的数组。该行将变量tmp设置为变量数据的值,而不是像你想象的那样复制char。

结果是你丢失了对malloc()分配的内存的唯一引用,并导致内存泄漏。

答案 1 :(得分:1)

等一下。考虑更换:

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

with:

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覆盖wew时,Yuo将“失去追踪”tesaja(“budipergikepasar”)在堆RAM中的位置。然后你将陷入“内存泄漏”,因为你不再有一个指向包含“budipergikepasar”的RAM块的指针,你将无法使用“budipergikepasar”的位置调用free()。考虑使用这样的代码:

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

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

使用malloc()和free()这种方式可以帮助您以更有效的方式利用可用的RAM。还有其他一些处理内存管理的方法,但是我这样做是为了强调跟踪你使用malloc()分配的内容的重要性,然后在准备就绪时用free()释放空间。

希望有所帮助 -

佩里

答案 2 :(得分:0)

  

是区域1中的内存   自动解除分配

没有。你应该打电话给free()

答案 3 :(得分:0)

这个程序是完全错误的。

tmp = data只是将main中声明的静态字符序列分配给tmp,并泄漏已分配的内存。

你想要完成什么?

答案 4 :(得分:0)

目前,您正在为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;
}