0

私は自分のstrcpyプログラムを実装することになっている「C」の関数を持っています。これが私が書いたものです。ただし、セグメンテーション違反の原因をデバッグできません。

#include <stdio.h>
#include <stdlib.h>

char * mystrcpy(char *dest, char *src) {
    char * ptr = dest;
    while (*src != '\0'){
        *ptr = *src;
        ptr++; src++;
        //printf("Dest is \"%s\" and Source is \"%s\"\n",dest,src);
    }
    *ptr = '\0';
    return dest;
}


int main() {
    char str[] = "I rock always";
    char * dest = NULL;
    dest = mystrcpy(dest, str);
    printf("Source String %s and Destination String %s\n", str, dest);
}

誰かが私にこの振る舞いを説明できますか?

4

5 に答える 5

4

宛先文字列にメモリを割り当てる必要があります。

int main() {
    char str[] = "I rock always";
    char * dest = (char*)malloc(strlen(str) + 1);
    dest = mystrcpy(dest, str);
    printf("Source String %s and Destination String %s\n", str, dest);
}

もちろん、最終的にメモリを解放するのは良いマナーです:

    free(dest);
于 2012-06-24T09:45:21.553 に答える
1

*destを指す ためにメモリを割り当てることはありません。

NULL を指し始めてから、次のことを試みます*ptr = *src

于 2012-06-24T09:45:17.620 に答える
0

メモリを割り当てて試してみてください....

         #include <stdio.h>
         #include <stdlib.h>

         char * mystrcpy(char *dest, char *src) 
         {
                     char * ptr = dest;
                     int index=0;
                     while (*src != '\0')
                     {
                         *(ptr+index) = *(src+index);
                           index++;
                     }
                     *(ptr+index) = '\0';
                     return dest;

          }




          int main() 
          {
                char str[] = "I rock always";
                char * dest = (char*)malloc((strlen(str)+1)*sizeof(char));
                dest = mystrcpy(dest, str);
                printf("Source String %s and Destination String %s\n", str, dest);
                free(dest);
                return 0;
          }
于 2012-06-24T09:58:22.483 に答える
0

宛先文字列バッファにメモリを割り当てる必要があります。

メモリ管理はCの非常に大きな部分です...メモリが使用され、要件に対して余剰になるため、メモリの割り当てと割り当て解除に非常に注意する必要があります。そうしないと、セグメンテーション違反 (メモリの割り当てに失敗) やメモリ リーク (メモリの解放に失敗) が発生します。

ここでの他の回答はmallocの例を示しているので、ここでは繰り返しません。

独自の関数を作成するのではなく、すでに利用可能な関数を可能な限り使用する必要があります。これにより、誰かがすでにデバッグして最適化しているため、実装のエラーを回避できます。

http://www.cs.cf.ac.uk/Dave/C/node19.html

于 2012-06-24T09:45:23.133 に答える
0
#include <stdio.h>

    /* this the K&R version of strcpy */
char * mystrcpy(char *dest, char *src) {
    char *ptr = dest;
    while ( *ptr++ = *src++ ) {;}

    return dest;
}


int main(void) {
    char str[] = "I rock always";
    char dest[sizeof str];
    char *result;

    result = mystrcpy(dest, str);
    printf("Source String %s and Destination String %s and result %s\n", str, dest, result);
    return 0;
}
于 2012-06-24T10:05:31.917 に答える