C中的内存替换?

C中的内存替换?,c,memory,malloc,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(

伙计们,我有一个关于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;
}
我唯一的问题是, 区域1中的内存是否会自动释放并替换为新内存

thx预先

行“tmp=data”并没有按照您认为的那样执行。在C中,使用strcpy()复制字符串。C字符串是字符元素的数组。该行将变量tmp设置为变量数据的值,而不是像您所想的那样复制字符

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

行“tmp=data”没有执行您认为的操作。在C中,使用strcpy()复制字符串。C字符串是字符元素的数组。该行将变量tmp设置为变量数据的值,而不是像您所想的那样复制字符

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

区域1中的内存是否会损坏 自动解除分配

不,你应该打免费电话

区域1中的内存是否会损坏 自动解除分配


不可以。您应该调用free()

此程序完全错误

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


你想完成什么?

这个程序完全错误

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


您想要完成什么?

现在,您正在为
tmp
分配空间,但随后您正在将对
tmp
的引用切换为对
数据的引用。您的代码应该改为使用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;
}
#包括
#包括
#包括
char*tesaja(char*data)
{
char*tmp=(char*)malloc(sizeof(char)*strlen(data));
tmp=strcpy(tmp,数据);
返回tmp;
}
int main()
{
//区域1
char*wew=tesaja(“budipergikepasar”);
printf(“nilai wew:%s\n”,wew);
//区域2
wew=tesaja(“kepasarbudisedangpergi”);
printf(“nilai wew:%s\n”,wew);
返回0;
}

现在,您正在为
tmp
分配空间,但随后将对
tmp
的引用切换为对
数据的引用。您的代码应该改为使用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;
}
#包括
#包括
#包括
char*tesaja(char*data)
{
char*tmp=(char*)malloc(sizeof(char)*strlen(data));
tmp=strcpy(tmp,数据);
返回tmp;
}
int main()
{
//区域1
char*wew=tesaja(“budipergikepasar”);
printf(“nilai wew:%s\n”,wew);
//区域2
wew=tesaja(“kepasarbudisedangpergi”);
printf(“nilai wew:%s\n”,wew);
返回0;
}

稍等。考虑替换:

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覆盖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()释放该空间

希望有帮助-


佩里

等一下。考虑替换:

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覆盖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()释放该空间

希望有帮助-


佩里

是的,我真的是指strcpy(),我只是忘了使用strcpy()--,如果只是在这种情况下,我使用strcpy()将
数据的值
复制到
tmp
的变量,那么在再次调用tesaja()函数时,区域1还会自动取消分配并替换为新的吗?不会,
C
不会自动取消分配
malloc
的结果。您需要显式调用
free(wew)数据的值复制到
tmp
的变量,那么在再次调用tesaja()函数时,区域1还会自动取消分配并替换为新的吗?否,
C
不会自动取消分配
malloc
的结果。您需要显式调用
free(wew)在区域1的末尾。如果只有您的代码,则将
区域1
自动释放一次
区域2
尝试调用
tesaja()
?不,不会。I b