计数器 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: %dn", key);
}
key
的最终值是 3
。应该是2
.
如果我在第一次出现时将"foo"
更改为"foo1"
,则key
的最终值是 1
,正如预期的那样。
如果我将arr[key] = 2
更改为 arr[key] = 1
,或删除该行,则key
的最终值是 2
,正如预期的那样。
这是为什么呢?
代码中有未定义的行为,因此任何事情都可能发生。
int arr[] = {};
是一个非标准大小的零大小数组。 由于它的大小为 0,因此访问任何元素并设置其值是未定义的行为。 由于我们现在有未定义的行为,因此不再有任何方法可以推理程序的工作原理。
当你这样做时:
int arr[] = {};
您正在尝试告诉编译器为大小等于 {}
之间指定的元素的大小数组分配内存。但是由于您没有元素,编译器没有分配任何内存。所有这些都发生在编译时。
然后你试图arr[key] = 2;
,你试图修改你不拥有的内存。在这种情况下,您要么会得到分段错误,要么代码会静默地继续移动并损坏分配的内存,这些内存由您的代码分配给其他地方。
所以理想情况下,你应该在{}
之间有一些元素,如果你在编译时知道你永远不会需要更多,或者在运行时使用动态分配。
这是未定义的行为,因此它可能会在不同的编译器上或出于多种原因中的任何一种产生不同的结果。
您定义的数组长度为零。该标准可能会强制要求最小长度为 1,但在这种情况下,这并不重要 - 您正在访问[1]
无论哪种方式都超出界限。这就是导致未定义行为的原因。
相关文章:
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 在这种情况下,int**在C中是什么意思
- 如何在不返回 C++ 值的情况下退出 int 函数?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 无符号 int 与无符号长 两者都是 32 位,但我无法在不转换的情况下混合它们......为什么?
- 如何在没有参数的情况下实现返回双向链表大小的函数?int size() const.
- <int> 在不破坏堆栈的情况下获取 C++ 中的堆栈总和
- 为什么在这种情况下使用 int *arr = new int [number]
- 在 int 数组的情况下,新表达式可以"overflow"吗?
- 如何在不复制的情况下更新 std::unordered_map<std::string, std::vector> 中的向量<int>?
- 如何在不使用堆栈或数组的情况下从INT中提取每个数字?(C )
- 读取即将在没有同步的情况下同时增加的int是安全的吗?
- 在没有初始化列表的情况下,在c++的headerfile中为const int赋值
- 如何在<int>不重建数组的情况下将 vector<vector> 转换为 int**?
- 在 priority_queue 内部 pair<int、int> 的情况下决定优先级?
- 有没有什么方法可以在不丢失十进制值的情况下将浮点值转换为int值
- 为什么两种情况下的行为不同1.int i=1,2,3;和第二.int i;i=1,2,3;
- 开关情况下的字符和 int 有什么区别?
- 在这种情况下,静态 int 的值会发生变化吗?