从函数返回值的更好方法

时间:2013-07-10 15:25:03

标签: c

#include<stdio.h>

char* my_strcpy(char* source, char* destination) {
    char* p = destination;
    while( *source != '\0' ) {
        *p++ = *source++;
    }
    *p = '\0';
    return destination;
}

int main() {
    char stringa[40] = "Time and tide wait for none";
    char stringb[40];
    char *ptr;
    char *ptr1;

    ptr = stringa;
    ptr1 = stringb;

    puts(stringa);
    puts(ptr);

    my_strcpy(ptr, ptr1);
    puts(ptr);

    return 0;
}

这里变量destination作为函数的本地副本,返回指针是安全的。我相信只要地址在返回后立即使用它将是安全的,否则如果其他进程使用该地址,它将被更改。 如何在不return destination的情况下安全返回?

是否可以为p执行malloc并返回它而不是指定destination指向的位置?

1 个答案:

答案 0 :(得分:3)

destination不受my_strcpy控制,因此在函数外部发生的事情与my_strcpy无关。也就是说,函数返回destination是完全安全的。调用my_strcpy的人将负责确保变量的内存正常。返回destination变量只是函数链的便利。

你可以使用malloc并返回一个新的内存区域(尽管那时你不需要destination参数)。这基本上是strdup的功能,strdup的调用者负责释放已分配的内存。

注意,没有其他进程破坏内存的风险。除非您处理共享内存,否则每个进程只能访问其内存。稍后在此过程中的某些功能可能会改变您在my_strcpy中所做的操作,但这不是my_strcpy的问题。至于在函数之后立即使用它是安全的,你将复制到分配给你的空间。 p值不是您写入的内存;它只是指向内存的指针。并且内存本身不在堆栈中。正如jpw在某些时候提到的那样 - 你根本不需要p变量。