5

ポインターを使用して自分で strcpy を書き込もうとしていますが、実行時にエラーが発生します。

void str_cpy(char **destination, const char *source) {
//    char *s1 = *destination;

   while (*source != '\0') {
      **destination++ = *source++; //Get an error here
   }
   **destination = '\0';
}

次のように関数を呼び出します。

char *str = NULL;
str_cpy(&str, "String");

大丈夫じゃない?

ありがとう!

4

7 に答える 7

8

いいえ、大丈夫ではありません。なんで?strNULLポインタだからです。それは何も指していない。あなたがそれに値を書き込もうとすると、それらはどこに行きますか?割り当てられたメモリを指していません!

まず、にメモリを割り当てる必要がありますstr。できるよ:

char *str = malloc(strlen("String") + 1); // + 1 for the '\0' character at the end of C-style strings

または、次のことができます。

char str[256]; // make str large enough to hold 256 chars. Note that this is not as safe as the above version!

また、destinationダブルポインタではなく、シングルポインタである必要があります。ええと、ダブルポインタを使用することは技術的に間違っていません、それはただ不必要です。

str_cpyオプションで、次のように関数にメモリを割り当てることができます。

void str_cpy(char **destination, const char *source) {
    *destination = malloc(strlen(source) + 1);
    // ... continue as normal
于 2012-11-19T19:45:35.677 に答える
4

簡単にするために、これは関数内の1行で実行できます。

void mystrcpy(char *dest, const char *src) {
  while (*dest++ = *src++);
}

destそうは言っても、事前に使用するためにmalloc、または単に。のような文字配列を使用するために、メモリを割り当てる必要がありますchar dest[256]

于 2012-11-19T19:50:31.457 に答える
3

ポインターツーポインターを渡す必要はありません。

void str_cpy(char *dst, const char *src) {
   while (*src != '\0') {
      *dst++ = *src++; 
   }
   *dst = '\0';
}

dstまた、渡す前にメモリを割り当てる必要があります。

const char *src = "String";
char *str = malloc(strlen(src)+1); //plus one for null byte
str_cpy(dst, src);
于 2012-11-19T19:45:49.173 に答える
2

ポインタが指すもの(この場合はNULL)を満たす関数に渡す前に、そのポインタにメモリを割り当てる必要があります。

例:

char *str = malloc(128);
if (str)
{
   str_cpy(&str, "String");
   free(str);
   str = NULL;
}

ターゲットバッファのサイズ情報も提供せずにこれを行わないことをお勧めします(つまり、独自に作成している場合は、ターゲットバッファの境界を確認してください。そうしないと、バージョンに同じセキュリティ上の欠陥があり、strcpy()それが十分に悪いものになります)。

注:ターゲットとして渡されたポインターが保持するアドレスを変更する予定がない限り、ダブルポインターも使用する必要はありません。strcpy()あなたが持っているダブルポインターの使用法は、次のような従来の使用パターンを防ぎます。

char str[128];
str_cpy(&str, "Hello"); // error. 

配列アドレスをポインターからポインターとして渡すことはできないため、コードは中間ポインターなしで静的配列を埋めることはできません。

char str[128];
char *p = str;
str_cpy(&p, "Hello");  //ok. passing address of pointer.

strdup()これが意図的でない場合(そして、NULLポインターのパッセージを内部的にエミュレートするという考えがない限り、なぜそうなるのかわかりません)、これに対処する必要があります。

于 2012-11-19T19:44:30.380 に答える
0

これが完全な実装です。ここから良い記事。タイミングとパフォーマンスについて説明します。私は自分自身を測定しませんでした。 http://www.howstuffworks.com/c35.htm

char* mystrcpy(char *dst, const char *src) {
char *ptr = dst;
while ((*dst++ = *src++) ) ;
return ptr;
}

int main(int argc, char *argv[]) {
const char *src = "This is C.\0";
char *dst = malloc(sizeof(char)*(strlen(src)+1)); //+1 for the null character
dst = mystrcpy(dst, src);
printf("%s",dst);
return 1;
}
于 2013-05-18T00:26:29.190 に答える
0

最近、上記の同じ問題に直面しましたdouble pointer strcpy implementation

コードの下で他の人に役立つかもしれません

 void strcpy_i( char **dst, const char *src )
 {
    *dst=(char *)malloc((strlen(src)+1)*sizeof(char));

    char *tmp=*dst;

    if(tmp == NULL || src == NULL)
    return ;

    while((*tmp++=*src++)!='\0');
}

int main()
{
    char v[]="Vinay Hunachyal";
    char *d=NULL;

    strcpy_i(&d,v);
    printf("%s",d);

 return 0;

}

于 2014-10-11T17:11:51.060 に答える