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

时间:2015-07-10 03:26:40

标签: c arrays

我正在学习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中工作?

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

2 个答案:

答案 0 :(得分:6)

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

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

这是因为a2的大小为5,a1的大小为4,因此您访问了a1a1[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]);
}