我正在学习C语言。 当我将一个元素的数组值分配给另一个时,(看起来)会发生奇怪的事情。 我的代码如下。
foreach ($t1 as $key => $value) {
if($value['cust_type'] = 'Corporate')
{
print_r($value['trx']);
}
echo "<br/>";
}
结果如下。
5 4 --- b b b b --- b
我不知道为什么 a [4] a2 [4]值为“b”。
首先,我认为如果我尝试编译此代码,编译器会通过错误,但它说好。
所以我显示结果并看到a2 [4]元素包含“b”字符。
数组如何在C中工作?
我应该学习更深入理解机制的概念?
答案 0 :(得分:6)
正如您在执行以下操作时已经指出的那样,您将得到未定义的行为:
for(i =0; i < sizeof(a2); i++){
a2[i]=a1[i];
printf("%c\n", a2[i]);
}
这是因为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中未定义行为时的含义。
答案 1 :(得分:1)
“为什么a[4]
值为"b"
”不正确。 (当然OP在这里意味着a2
。)
请注意,a2
的大小打印为5.以下内容 访问a2
的数组范围之外。相反,代码只是最初打印空字符'\0'
,然后....
char a2[] = "aaaa";
....
printf("%c\n",a2[4]);
代码在上一次迭代中使用以下循环输入未定义的行为,因为a2[4] = a1[4];
访问其a1
大小之外的char
。所以代码行为的其余部分是 undefined 。
char a1[] = "bbb";
...
for(i =0; i < sizeof(a2); i++){
a2[i]=a1[i];
printf("%c\n", a2[i]);
}