2013-07-10 3 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

destinationmy_strcpy으로 제어되지 않으므로 함수 외부에서 발생하는 일은 my_strcpy과 관련이 없습니다. 다시 말하면 함수가을 반환하는 것은 완벽하고 안전합니다. my_strcpy을 호출 한 사람은 변수의 메모리가 정상인지 확인해야합니다. destination 변수를 반환하는 것은 단순히 함수 체이닝의 편의입니다.

새로운 메모리 영역을 malloc하고 반환 할 수는 있지만 (destination 매개 변수는 필요하지 않지만). 기본적으로 strdup의 기능이며 할당 된 메모리를 확보하는 것은 strdup의 호출자가 담당합니다.

다른 프로세스로 인해 메모리가 손상 될 위험이 없습니다. 공유 메모리를 다루지 않는 한 프로세스는 각각의 메모리에만 액세스 할 수 있습니다. 이 프로세스에서 나중에 수행되는 일부 기능은 my_strcpy에서 수행 한 작업을 변경할 수 있지만 my_strcpy의 문제는 아닙니다. 함수의 직후에 사용된다면 안전하다는 의미에서 할당 된 공간으로 복사하는 것입니다. p 값은 쓰고있는 메모리가 아닙니다. 그것은 메모리에 대한 포인터 일뿐입니다. 그리고 메모리 자체는 스택에 없습니다. 어떤 시점에서 jpw가 언급되었으므로 p 변수가 전혀 필요하지 않습니다.

+0

네 말이 맞습니다. stringb의 주소 위치를 가리 킵니다. – Angus

관련 문제