这是我的源代码:
char *
cpy_strcpy (dest, src)
char *dest;
const char *src;
{
char c;
char *s = (char *) src;
const ptrdiff_t off = dest - s - 1;
do
{
//c = *s++
//s[off] = c;
s[off] = *s;
}
while (*s++ != '\0');
//while( c != '\0' );
return dest;
}
当我使用gdb调试时,我得到了这个:
(gdb) s
26 while (*s++ != '\0');
(gdb)
27 return dest;
(gdb)
28 }
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x000000000040050a in cpy_strcpy (dest=can't compute CFA for this frame
) at strcpy.c:28
28 }
此源代码是从glibc复制的,但我更改了一些行(带注释//)
我真的无法弄清楚我的新代码有什么问题。有人可以帮帮我吗?
答案 0 :(得分:5)
s[off] = *s
错误。
s[off]
指向地址s + off
,在第一个循环中为:
s + off = s + (dest - s - 1) = dest - 1
地址(dest - 1)
超出了char数组的左边界。
原始代码是正确的,因为c = *s++
可以首先使用s指定c,然后增加s,这使得s[off]
中的s[off] = c
只指向dest
,而不是dest - 1
{1}}。