2012-10-07 54 views
-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' ; 
} 

这个代码给出输出:这是为什么发生在c?

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 

为什么源值变化,和目标变为具有串的尺寸数组?

+2

我可以缩进这段代码吗? – Jack

+2

任何托管环境都需要来自'main'的整型返回值。 – chris

+0

请格式化您的代码。这是一个混乱的时刻,没有人会想要筛选。 –

回答

5

当您的目标短于要求时,它会覆盖它后面的任何数据。特别是,当你制作它8时,它会覆盖终止零的源的开始。当你制作它4时,它会用源字符串的尾部覆盖源。

这就是发生了什么事。虽然这种行为不能保证,当然,未定义。

+0

谢谢迈克尔,我明白了。当我把目标和源数组声明之间的另一个字符数组,源数组完美打印。 – HardikHarpal

+0

是的,但通常应该防止访问超出分配大小的数组元素。你无法可靠地分辨阵列末尾发生了什么。 –

1

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

+3

在堆的末尾写入仍然是未定义的行为。 – chris

+1

后面跟着“CODE”? –

0

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

相关问题