-1
void xstrcpy ( char *t, char *s );

void main(void ) {      
    char source[ ] = "Sayonara" ;
    char target[20] ;
    xstrcpy ( target, source ) ;   
    printf ( "\nsource string = %s", source);
    printf ( "\ntarget string = %s", target ) ; 
}

void xstrcpy ( char *t, char *s ) {  
    while ( *s != '\0' ){
        *t = *s ;    
        t++ ; s++ ;
    } 
    *t = '\0' ;
} 

このコードは出力を提供します:

source string = Sayonara 
target string = Sayonara

しかし、に変更char target[20];すると、次char target[8];のようになります。

source string =  target string = Sayonara

に変更char target[20];すると、次char target[4];のようになります。

source string = nara 
target string = Sayonara

に変更char target[20];すると、次char target[3];のようになります。

source string = nara 
target string = Sayonara

ソース値が変更され、ターゲットが文字列のサイズの配列になるのはなぜですか?

4

3 に答える 3

5

ターゲットが必要以上に短い場合、それに続くデータはすべて上書きされます。特に、作成すると8、ソースの先頭をゼロで終了して上書きされます。作成すると4、ソースがソース文字列の末尾で上書きされます。

これが起こっていることです。もちろん、この動作は保証されていませんが、未定義です。

于 2012-10-07T18:11:50.480 に答える
1

ターゲットはスタックに割り当てられているため、オーバーフローしたデータをこの配列にコピーすると、それに続くコードが上書きされます。それをしないでください、それは未定義の振る舞いです。

于 2012-10-07T18:10:29.810 に答える
0

配列境界チェックはありません。データオーバーフローが発生した場合の動作は未定義です。

于 2012-10-08T09:34:51.417 に答える