'\ 0'末尾的C字符串

问题描述 投票:1回答:2

在编写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)

感谢s.o上的this question,我学会了字符串应该以'\ 0'结尾,但为什么上面的代码不起作用,即使它在声明时不会导致错误? (当char b [10] =“123456789”时效果很好)

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

c string strcpy
2个回答
6
投票

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

通常情况下,编译器会警告您提供的初始化程序太大,但这种特殊情况是一个非常特殊的陷阱。在C标准的初始化规则中,我们发现了这个小恶行规则(C176.7.9§14,强调我的):

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

在你的情况下没有空间,所以你没有得到空字符。由于这个奇怪的小规则,编译器也没有对它发出警告,因为代码符合C标准。


4
投票

char b[10] = "1234567890";不包含NUL终止符

while ((*s++ = *t++));

没有正确终止(正式程序行为未定义)。请注意,常数"1234567890"char[11]类型;编译器允许您将其分配给较小的数组,并自动删除元素。

© www.soinside.com 2019 - 2024. All rights reserved.