Dint找到我的答案的确切链接,所以在函数返回char *
的条件下询问这个简单的问题我以这种方式编写代码,以便concat函数本身应该分配&释放记忆。
任何人都可以帮助解决问题:
1)释放内存是否正确? (我跑Valgrind&也没发现任何问题)
2)如果指向“ptr”分配保持值,根据我的理解,如果释放一个ptr的内存,那么值也应该丢失吗?如果我错了,请纠正我。
char * concat(char *str1, char *str2)
{
char *ptr;
ptr=(char*)malloc(strlen(str1)+strlen(str2)+1); //allocated+1 for NULL character as well
int i=0,j=0;
while(str1[i]!='\0')
{
ptr[j]=str1[i];
printf("letter from src is %c\n",str1[i]);
i++; j++;
}
i=0;
while(str2[i]!='\0')
{
ptr[j]=str2[i];
j++;i++;
}
ptr[j]='\0';
cout<<ptr;
free(ptr);
return ptr;
}
int main()
{
char *str1="hello";
char *str2="world";
cout<<str1<<endl;
cout<<str2<<endl;
char *res=concat(str1,str2);
return 0;
}
答案 0 :(得分:1)
Valgrind并不抱怨,因为你无法访问main中的res
。如果您确实阅读res
,那么我希望您会收到Valgrind错误,很可能会在更大的应用程序中崩溃。
您需要更改concat
的结尾以删除对free
的调用,即
cout<<ptr;
return ptr;
}
除了手写循环外,您还可以使用strcat
,即
ptr=(char*)malloc(strlen(str1)+strlen(str2)+1);
strcat(ptr, str1);
strcat(ptr, str2);
然后在main中你可以使用你的结果。例如
int main()
{
char *str1="hello";
char *str2="world";
cout<<str1<<endl;
cout<<str2<<endl;
char *res=concat(str1,str2);
cout << "res from main: " << res << "\n";
free(res);
return 0;
}
答案 1 :(得分:1)
当您致电ptr = malloc(/*size*/)
时,系统会为您分配至少所请求大小的可用内存块;并且会返回此块开头的内存地址。
当你致电free(ptr)
时,你告诉系统你不再需要那块内存。但是,在调用之后,您的指针仍将指向相同的内存地址。
free
的实施取决于系统。在调用free(ptr)
后访问此地址的内存是未定义的行为。