我是靠自己学习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中工作?
我应该学习更深入理解机制的概念?
正如您在执行以下操作时已经指出的那样,您将获得未定义的行为:
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中的行为未定义时,这意味着什么.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |