'\ 0'末尾的C字符串

用户

在编写C代码时,我尝试编写strcpy自己的代码,而我遇到了这个问题。

#include <stdio.h>
#include <string.h>

void strcpy2(char *s, char *t);

int main() {
    char a[10] = "asds";
    char b[10] = "1234567890";

    strcpy2(a, b);
    printf("Copy completed! : %s", a);
    return 0;
}

void strcpy2(char *s, char *t) {
    while ((*s++ = *t++));
}

错误代码:进程结束,退出代码为-1073741819(0xC0000005)

由于这样的问题,我了解到字符串应以'\ 0'结尾,但是即使上面的代码在声明时不会引起错误,为什么上面的代码也不起作用?(当char b [10] =“ 123456789”时效果很好)

那么,'\ 0'到底如何影响此过程并最终导致错误?(运行时?编译时?等等)(我只知道'\ 0'应该是字符串的结尾)

伦丁

在此行上char b[10] = "1234567890";,字符串文字"1234567890"正好是10个字符+ 1个空终止符。数组中没有剩余空间,因此不会以null终止。

通常,编译器会警告您提供太大的初始化器,但是这种特殊情况是非常特殊的陷阱。在C标准的初始化规则中,我们发现了这个小的邪恶规则(C17 6.7.9§14,重点是我的):

字符类型的数组可以由字符串文字或UTF-8字符串文字初始化,并可选地用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)将初始化数组的元素。

您的情况下没有空间,因此您不会得到空字符。而且由于这个奇怪的小规则,编译器也没有警告它,因为代码符合C标准。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章