将char*传递给函数并获取返回值....这是正确的方法吗?

Kun*_*nal 1 c

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调用结束后到期.所以,我在堆中分配内存并返回它.请建议是否有更好的方法和我正在释放的记忆是正确的工作方式.

Mar*_*ins 5

可能有多种方法可以做到这一点.例如,可以传递指向信息被写入的缓冲区(例如,可能是调用函数中的堆栈中的一个)的第二参数.如果您选择了该路由,您可能还需要传递缓冲区的长度,以便该函数可以确保它不会覆盖超出内存的末尾.

目前的方法可能是合理的(取决于目标).但是,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)