#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
指向的位置?
答案 0 :(得分:3)
destination
不受my_strcpy
控制,因此在函数外部发生的事情与my_strcpy
无关。也就是说,函数返回destination
是完全安全的。调用my_strcpy
的人将负责确保变量的内存正常。返回destination
变量只是函数链的便利。
你可以使用malloc并返回一个新的内存区域(尽管那时你不需要destination
参数)。这基本上是strdup
的功能,strdup
的调用者负责释放已分配的内存。
注意,没有其他进程破坏内存的风险。除非您处理共享内存,否则每个进程只能访问其内存。稍后在此过程中的某些功能可能会改变您在my_strcpy
中所做的操作,但这不是my_strcpy
的问题。至于在函数之后立即使用它是安全的,你将复制到分配给你的空间。 p
值不是您写入的内存;它只是指向内存的指针。并且内存本身不在堆栈中。正如jpw在某些时候提到的那样 - 你根本不需要p
变量。