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ですか?

4

1 に答える 1

3

destinationによって制御されないmy_strcpyため、関数の外で何が起こるかは には関係ありませんmy_strcpy。つまり、完全に安全であり、関数が を返すことが期待されていますdestination。誰が呼び出しmy_strcpyても、変数のメモリが正常であることを確認する責任があります。変数を返すことdestinationは、関数チェーンの利便性にすぎません。

destination新しいメモリ領域を malloc して返すことができます (ただし、その場合はパラメーターは必要ありません)。これは基本的に の機能であり、割り当てられたメモリを解放するstrdupのは の呼び出し元の責任です。strdup

別のプロセスがメモリを破損するリスクはないことに注意してください。共有メモリを扱っていない限り、プロセスはそれぞれのメモリにしかアクセスできません。このプロセスの後のいくつかの機能は、 で行ったことを変更する可能性がありますがmy_strcpy、それは の問題ではありませんmy_strcpy。関数の直後に使用しても安全なのは、自分に割り当てられたスペースにコピーすることです。値は、p書き込み先のメモリではありません。それは単なるメモリへのポインタです。また、メモリ自体はスタック上にありません。ある時点でjpwが述べたように、p変数はまったく必要ありません。

于 2013-07-10T15:30:57.803 に答える