2

ステートメント*p++ = *source++; 次の最初のプログラムでは、エラーは発生しませんが、コンパイル時に 2 番目のプログラムで左辺値として使用される非参照型へのキャストを ISO C++ が禁止するというエラーが発生します。なぜこれが起こるのですか?

  • 最初のプログラム

    #include 
    
    char *my_strcpy(char *destination, char *source)
    {
        char *p = destination;
        while (*source != '\0')
        {
            *p++ = *source++;
        }
        *p = '\0'; 
        return destination;
    }
    
    int main()
    {
        char source[] = "A string to be used for demonstration purposes";
        char destination[80];   
        my_strcpy(destination, source);
        puts(destination);
        return 0;
    }
    
  • 2番目のプログラム

    #include 
    
    char source[] = "A string to be used for demonstration purposes";
    char destination[80];
    
    int main()
    {
        char *p = destination;
        putchar('\n'); 
        while(*source != '\0') 
        {
            *p++ = *source++; 
        }
        *p = '\0';
        puts(destination);
        return 0;
    }
    
4

3 に答える 3

2

これは、最初のプログラムがポインターをインクリメントするのに対し、2 番目のプログラムでは++演算子を配列に適用するために発生します。多くの場合、配列はポインターのように動作しますが、ポインターではありません。配列はポインター算術をサポートしますが、それらを扱うlvalue(つまり、それらが指している場所を変更しようとする) ポインター演算子はサポートしません。

問題の修正は簡単です。配列を指すポインタを作成し、次のようにループでそのポインタを使用するだけです。

char *p = destination;
putchar('\n'); 
char *src = source;
while(*src != '\0') 
{
    *p++ = *src++; 
}
*p = '\0';
puts(destination);
return 0;
于 2012-12-02T12:38:54.503 に答える
1

最初のプログラムsourceでは、 に渡すことで char へのポインタに変換されたためmy_strcpy、インクリメントできました。一方、2 番目のプログラムではsource配列のままであり、配列をインクリメントすることはできません。

ちなみに、C ライブラリはstrcpy次のように非常に短い方法で実装されていると思います。

while((*dst++ = *src++));

それだけです

于 2012-12-02T12:40:05.173 に答える
0

ソースを変更することはできません。目的地に p を指定したように、ソースへのローカル ポインターを作成しました。source は静的に定義された配列であるため、アドレスではなく内容のみを変更できます。

于 2012-12-02T12:37:35.480 に答える