-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

当你的目标比要求的短时,它会覆盖它后面的任何数据。特别是,当您 make it 时8,它会以终止零覆盖源的开头。当你做它时4,它会用源字符串的尾部覆盖源。

这就是正在发生的事情。虽然不能保证这种行为,但当然是未定义的。

于 2012-10-07T18:11:50.480 回答
1

由于 target 是在堆栈上分配的,因此当您将溢出的数据复制到此数组时,它会覆盖它后面的代码。不要那样做,这是未定义的行为。

于 2012-10-07T18:10:29.810 回答
0

没有数组绑定检查,如果发生数据溢出,则行为未定义!

于 2012-10-08T09:34:51.417 回答