Counter int 在不询问的情况下递增

Counter int is incremented without asking

考虑这段代码:

#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,正如预期的那样。

这是为什么?

您的代码中有 undefined behavior,所以任何事情都有可能发生。

int arr[] = {};

是一个非标准的零大小数组。由于其大小为 0,因此访问任何元素并设置其值是未定义的行为。由于我们现在有未定义的行为,因此不再有任何方法可以推断出程序是如何工作的。

这是未定义的行为,因此它可能会在不同的编译器上或出于多种原因产生不同的结果。

您定义的数组长度为零。标准 可能 强制执行最小长度 1,但在这种情况下无关紧要 - 您访问的 [1] 无论如何都是越界的。这就是导致未定义行为的原因。

当你这样做时:

int arr[] = {}; 您试图告诉编译器为大小等于 {} 之间指定的元素的数组分配内存。但是因为你没有元素,编译器没有分配任何内存。这一切都发生在编译时。

然后您正在尝试 arr[key] = 2;,您正在尝试修改不属于您的内存。在这种情况下,您要么会遇到分段错误,要么代码会默默地继续前进并损坏已分配的内存,而这些内存是由您的代码在其他地方分配的。

所以理想情况下你应该在 {} 之间有一些元素,如果你在编译时知道你永远不需要更多,或者在 运行 时使用动态分配。