2013-07-10 80 views
0
#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

出於好奇你是在練習數組複製和使用指針?執行'strcpy(destination,source)是不是更容易?無論如何也不需要返回指針:) – Nobilis

+0

「在大多數操作系統中,如果某個其他進程使用該地址,地址空間是虛擬化的,因此您不必擔心這個問題 – SirDarius

+0

Didn'你的意思是'* p ='\ 0';'而不是'p ='\ 0';' –

回答

3

destination不受my_strcpy的控制,所以在函數外面發生的事情與my_strcpy無關。也就是說,它是完全安全的,並且功能返回destination。誰叫my_strcpy將負責確保變量的內存是否正常。返回destination變量只是簡單的函數鏈接。

你可以malloc並返回一個新的內存區域(儘管你不需要參數destination)。這基本上是strdup的功能,並且調用者strdup負責釋放分配的內存。

請注意,沒有其他進程損壞內存的風險。除非你處理共享內存,否則進程只能訪問它們的內存。稍後在此過程中的某些功能可能會改變您在my_strcpy中所做的操作,但這不是my_strcpy的問題。至於在函數之後立即使用它是安全的,那麼您正在複製到分配給您的空間中。 p值不是您正在寫入的內存;它只是指向內存的指針。內存本身不在堆棧中。正如jpw在某個時候提到的 - 你根本不需要變量p

+0

是的你是對的。它指向stringb的地址位置。 – Angus