这一定是一个非常简单的问题,但我发现很难找到答案。
在C中,我编写了以下strncpy
- 类似函数:
int mystrncpy(char* s, char* t, int n) {
// copies at most n characters of t into s, assuming s is long enough
while (n > 0 && (*t != 0)) {
*(s++) = *(t++);
n--;
}
// at this point, either n=0 (in which case we ran out of string to copy)
// or *t = 0 (in which case we now need to null-terminate the string)
*s = 0;
return 0;
}
(它与strncpy
的不同之处在于它始终确保s
在结尾处以空值终止,并且其参数已相对于strncpy
进行交换。)
现在,如果我按如下方式调用它:
int main() {
char s[5] = "hello";
char* t = "oppagangnamstyle";
mystrncpy(s, t, 10);
printf("%s\n", s);
return 0;
}
我希望得到某种“尝试访问s
的元素5”错误,因为s
被分配为只有五个字符长。
实际发生的是打印“oppagangna”,程序返回退出代码0
。
当我逐步使用调试器时,在mystrncpy
中,字符s
指向的是先后'h','e','l','l','o',' \ 0','\ 0',...
它只是侥幸(或者,同样的事情,编译器/操作系统对我来说意外的好),s
恰好在内存中有零后,很高兴被填充执行mystrncpy
期间有更多元素?或者我误解了别的什么?