C++ 奇怪的是,For循环计数器变量减少了.get()

C++ 奇怪的是,For循环计数器变量减少了.get(),c++,for-loop,get,C++,For Loop,Get,考虑下面的代码。此函数用于从文件中读取一些整数和字符串 const int vardo_ilgis = 10; void skaityti(int &n, int &m, int &tiriama, avys A[]) { ifstream fd("test.txt"); fd >> n >> m >> tiriama; fd.ignore(80, '\n'); char vard[vardo_ilgis

考虑下面的代码。此函数用于从文件中读取一些整数和字符串

const int vardo_ilgis = 10;
void skaityti(int &n, int &m, int &tiriama, avys A[])
{
    ifstream fd("test.txt");
    fd >> n >> m >> tiriama;
    fd.ignore(80, '\n');
    char vard[vardo_ilgis]; // <---
    for(int i = 1; i <= n; i++)
    {
        cout << i << ' ';
        fd.get(vard, vardo_ilgis+1); // <---
        cout << i << endl;
        A[i].vardas = vard;
        getline(fd, A[i].DNR);
    }
    fd.close();
}
在这种情况下,变量“vard”的长度为vardo_ilgis=10,但在函数fd.get中,读取输入为vardo_ilgis+1=11(大于存储数据的变量长度)。我不是在问如何解决问题,因为很明显,读取的数据不能超过存储在变量上的数据。 然而,我真的很想理解这种行为的原因:循环计数变量减少了fd.get。为什么会发生这种情况,又是如何发生的?这就是这段代码的输出:

1 0
1 0
1 0
1 0
1 1
2 2
3 3
4 4

为什么要使用
+1

fd.get(vard, vardo_ilgis+1);
溢出缓冲区会损坏一些内存。在一个简单的未优化构建中,损坏的内存可能是循环索引

循环计数变量将减少fd.get。为什么会发生这种情况,又是如何发生的

一旦你知道你为什么会导致未定义的行为,很多人说你不应该去探究未定义行为的细节。我不同意。通过了解细节,您可以提高诊断不知道可能调用了哪些未定义行为的其他情况的能力

所有局部变量都存储在一起,因此覆盖其中一个变量可能会破坏另一个变量

您描述变量被“减少”,而实际上它被设置为零。在归零之前它是1这一事实并不影响它的归零。未定义的行为恰好等价于
i&=~255
对于256以下的值等于
i=0。更为偶然的是,您可以将其视为
i--

希望能弄清楚为什么输入用完后,
i
停止归零。

fd.get(vard,vardo\u ilgis+1)使缓冲区写入超出范围

在您的情况下,您写入(和不应该写入)的区域可能与存储
i
的内存区域相同


但是,最重要的是,你最终会有如此著名的未定行为。这意味着任何事情都有可能发生,而试图理解为什么或如何发生是毫无意义的(发生的是平台、编译器,甚至是特定于上下文的,我认为任何人都无法预测或解释)。

这是哪种语言?听起来像是高瓦莱里安
fd.get(vard, vardo_ilgis+1);