考虑以下代码:
#include <string.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
const char *task = "foo";
int key = 0;
int arr[] = {};
if (!strcmp(task, "foo")) {
key++;
}
arr[key] = 2;
key++;
printf("key: %d\n", key);
}
key
的最终值为3
。它应该是2
。
如果我在第一次出现时将"foo"
更改为"foo1"
,则key
的最终值为1
,正如所料。
如果我将arr[key] = 2
更改为arr[key] = 1
,或删除该行,则key
的最终值为2
,如预期的那样。
为什么会这样?
答案 0 :(得分:6)
您的代码中有undefined behavior,所以任何事情都可能发生。
{{1}}
是零大小的数组,不是标准的。由于其大小为0,访问任何元素并设置其值是未定义的行为。由于我们现在有未定义的行为,因此不再有任何方法可以推断出该程序的工作原理。
答案 1 :(得分:1)
这是未定义的行为,因此它可能会在不同的编译器上产生不同的结果,或者出于多种原因。
您定义的数组长度为零。标准可能强制执行最小长度为1,但在这种情况下并不重要 - 您无论是哪种方式都可以访问[1]
。这是导致未定义行为的原因。
答案 2 :(得分:1)
执行此操作时:
int arr[] = {};
您试图告诉编译器为大小的数组分配内存,该数组等于{}
之间指定的元素。但由于你没有元素,编译器没有分配任何内存。所有这些都发生在编译时。
然后你正在尝试arr[key] = 2;
,你正试图修改你不拥有的记忆。在这种情况下,您将获得分段错误,或者代码将静默移动并损坏分配的内存,这些内存由代码分配到其他地方。
理想情况下,如果你在编译时知道你永远不需要更多,或者在运行时使用动态分配,那么你应该在{}
之间有一些元素。