将数组元素指定给另一个时,包含意外值

csy*_*ouk 2 c arrays

我是靠自己学习C语言的.当我将一个元素的数组值分配给另一个时,(看起来)会发生奇怪的事情.我的代码如下.

int main(void){
    int i =0; 
    char a2[] = "aaaa";
    char a1[] = "bbb";

    printf("%lu\n",sizeof(a2));
    printf("%lu\n",sizeof(a1));
    printf("%c\n",a2[4]);
    printf("---\n");
    for(i =0; i < sizeof(a2); i++){
        a2[i]=a1[i];
        printf("%c\n", a2[i]);
    }
    printf("---\n");
    printf("%c\n", a2[4]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果如下.

5
4

---
b
b
b

b
---
b

我不知道为什么[4] a2 [4]值是"b".首先,我认为如果我尝试编译此代码,编译器会通过错误,但它说好.所以我显示结果并看到a2 [4]元素包含"b"字符.数组如何在C中工作?

我应该学习更深入理解机制的概念?

mis*_*mer 6

正如您在执行以下操作时已经指出的那样,您将获得未定义的行为:

for(i =0; i < sizeof(a2); i++){
    a2[i]=a1[i];
    printf("%c\n", a2[i]);
}
Run Code Online (Sandbox Code Playgroud)

这是因为大小a2为5且大小a1为4,因此您访问了超出数组的第五个元素a1(a1[4]).因此,当你这样做时a2[4] = a1[4],for循环的最后一次迭代正在做什么,你可以分配任何值,a2[4]因为a1[4]没有很好地定义值.因此即使a2[4]数组中的有效元素,您已经为其分配了一些定义不明确的元素,当您打印时,a2[4]您可以打印任何内容.请参阅最后一段,了解您最有可能获得的原因b.

有一些事情需要记住这一点.第一个数组是基于零的索引,C中的第二个字符串是空终止的,因此sizeof("aa")实际上是3而不是2.

由于你的程序有未定义的行为,它可以打印任何值,因为任何值都可以在a1 [4]中.话虽如此,如果编译器放入数组a2之后a1,你会不断地看到b打印为您分配的值b,以a2[0]在循环的第一次迭代.这只是你为什么看到一个可能的解释b.编译器不必将数组放在这个位置,事实上在我的机器上它不会将数组放在这个位置.当C中的行为未定义时,这意味着什么.