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;
,您正在尝试修改不属于您的内存。在这种情况下,您要么会遇到分段错误,要么代码会默默地继续前进并损坏已分配的内存,而这些内存是由您的代码在其他地方分配的。
所以理想情况下你应该在 {}
之间有一些元素,如果你在编译时知道你永远不需要更多,或者在 运行 时使用动态分配。
考虑这段代码:
#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;
,您正在尝试修改不属于您的内存。在这种情况下,您要么会遇到分段错误,要么代码会默默地继续前进并损坏已分配的内存,而这些内存是由您的代码在其他地方分配的。
所以理想情况下你应该在 {}
之间有一些元素,如果你在编译时知道你永远不需要更多,或者在 运行 时使用动态分配。