伙计们我对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 中的内存是否会自动解除分配并替换为新内存?
事先提前答案 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;
}