char * func(char * str)
{
char *ptr = (char *)malloc(strlen(str));
sprintf(ptr,"%s",str);
* (ptr +1) = 'E';
printf("%s\n",ptr);
return ptr;
}
void main()
{
char * str = "kundan";
char * str1 = func(str);
printf("%s\n",str1);
free(str1);
printf("%s\n",str1);
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的问题,但我很困惑.我正在向函数发送char*并接收返回值,该值也是char*.我不能在func()中使用堆栈内存作为返回,因为它将在func调用结束后到期.所以,我在堆中分配内存并返回它.请建议是否有更好的方法和我正在释放的记忆是正确的工作方式.
可能有多种方法可以做到这一点.例如,可以传递指向信息被写入的缓冲区(例如,可能是调用函数中的堆栈中的一个)的第二参数.如果您选择了该路由,您可能还需要传递缓冲区的长度,以便该函数可以确保它不会覆盖超出内存的末尾.
目前的方法可能是合理的(取决于目标).但是,malloc对于null终止符,调用需要长一个字节:
char *ptr = (char *)malloc(strlen(str) + 1);
Run Code Online (Sandbox Code Playgroud)
此外,strcpy可以在此之后使用将输入复制到该分配的缓冲区.这通常是更常见的方法:
strcpy( ptr, str );
Run Code Online (Sandbox Code Playgroud)