dint找到了我答案的确切链接,因此在函数返回char *
的何处,询问这个简单的问题我以这种方式编写了代码,以便Concat函数本身应该分配&释放内存。
任何人都可以帮助解决这些问题:
1)放置内存是否正确放置?(我跑了Valgrind&也没有发现)
2)如何根据我的理解,如何分配的保存值,如果释放了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]!=' ')
{
ptr[j]=str1[i];
printf("letter from src is %cn",str1[i]);
i++; j++;
}
i=0;
while(str2[i]!=' ')
{
ptr[j]=str2[i];
j++;i++;
}
ptr[j]=' ';
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;
}
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);
然后,您可以使用结果。例如
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;
}
当您调用ptr = malloc(/*size*/)
时,系统将至少由您要求的大小的自由存储器分配给您;并将此块开始的内存地址返回给您。
当您致电free(ptr)
时,您正在告诉系统您不再想要那个内存的块。但是,您的指针仍将指向通话后的相同内存地址。
free
的实现取决于系统。在您打电话给free(ptr)
之后,在此地址访问内存是未定义的行为。