为什么这发生在c?

时间:2012-10-07 18:06:14

标签: c

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

为什么源值会改变,而target会变成大小为string的数组?

3 个答案:

答案 0 :(得分:5)

当你的目标比所需的更短时,它会覆盖它后面的任何数据。特别是,当你使它成为8时,它会以源终止为零结束。当它成为4时,它会用源字符串的尾部覆盖源。

这就是发生的事情。虽然这种行为无法保证,但当然是未定义的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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