C++ C+中的Bug+;代码:将一个变量设置为零会导致不相关的变量变为零

C++ C+中的Bug+;代码:将一个变量设置为零会导致不相关的变量变为零,c++,arrays,debugging,C++,Arrays,Debugging,为什么在执行语句arr[26]={0}之后,下面代码中变量n2的值变为0,(我在调试时意识到了这一点) 而memset(arr,0,sizeof(arr));工作完美 #include<bits/stdc++.h> using namespace std; int main() { long int n1,n2; int count=0,flag; int arr[26] = {0}; cin>>n1>>n2; str

为什么在执行语句arr[26]={0}之后,下面代码中变量n2的值变为0,(我在调试时意识到了这一点) 而memset(arr,0,sizeof(arr));工作完美

#include<bits/stdc++.h>
using namespace std;

int main()
{
    long int n1,n2;
    int count=0,flag;
    int arr[26] = {0};
    cin>>n1>>n2;
    string box1[n1];
    string box2[n2];

    for(int j=0;j<n1;j++)
    cin>>box1[j];

    for(int j=0;j<n2;j++)
    cin>>box2[j];

    count=0;

    for(int i=0;i<n1;i++)
    {   

        for(int j=0;j<n2;j++)
        {
            arr[26]={0}; // after the execution of this statement, n2 changes to 0.. WHY???
            //memset(arr,0,sizeof(arr)); // If i use memset , things work correctly
            cout<<n2<<endl; //n2 becomes zero
            for(int k=0;k<box1[i].length();k++)
                arr[box1[i][k]-'A']++;

            for(int k=0;k<box2[j].length();k++)
                arr[box2[j][k]-'A']++;

            for(int k=0;k<26;k++)
            {
                if(arr[k]>=1)
                    continue;
                else
                {
                    flag=1;
                    break;
                }

            }

        }

    }
    printf("%d",count);
   return 0;
}
#包括
使用名称空间std;
int main()
{
长int n1,n2;
整数计数=0,标志;
int-arr[26]={0};
cin>>n1>>n2;
字符串框1[n1];
字符串框2[n2];
对于(int j=0;j>box1[j];
对于(int j=0;j>box2[j];
计数=0;
对于(int i=0;i您将arr声明为:

int arr[26] = {0};
这意味着它的有效索引是0-25,总共26个点。然后当您写入
arr[26]
时,实际上是在数组之外写入,并覆盖编译器分配给
n2
的内存

如果希望能够索引到26,则需要为27整数声明空间:

int arr[27] = {0};
此外,守则:

arr[26]={0}; // after the execution of this statement, n2 changes to 0.. WHY???
只分配给数组中的元素26。它不会将整个数组或类似的东西归零。在运行时将整个数组归零的方法是使用
arr={0}
或使用您已有的
memset
代码。

您将arr声明为:

int arr[26] = {0};
这意味着它的有效索引是0-25,总共26个点。然后当您写入
arr[26]
时,实际上是在数组之外写入,并覆盖编译器分配给
n2
的内存

如果希望能够索引到26,则需要为27整数声明空间:

int arr[27] = {0};
此外,守则:

arr[26]={0}; // after the execution of this statement, n2 changes to 0.. WHY???

只分配给数组中的元素26。它不会将整个数组或类似的东西归零。在运行时将整个数组归零的方法是使用
arr={0}
或使用您已有的
memset
代码。

我怀疑OP实际上想要
memset(arr,0,sizeof(arr));
,正如注释
//如果我使用memset,事情就会正常运行。@KenY-N他问“执行此语句后,n2变为0..为什么???”他已经知道MeSET会修复这个问题。在运行时,将整个数组取零点的正确方法是使用MeSET——这是C++,其中可以使用<代码> ARR= { 0 }来完成数组的零化。
@PaulMcKenzie谢谢,我有C语言背景,但我不知道。我编辑了我的答案,也包括了你的解决方案。@PaulMcKenzie-你确定吗?使用gcc和
-std=C++14
我从初始值设定项列表中得到了一个
分配给数组的错误。我怀疑OP实际上想要
memset(arr,0,sizeof(arr));
,正如注释
//如果我使用memset,事情就会正常运行。@KenY-N他问“执行此语句后,n2变为0..为什么???”他已经知道MeSET会修复这个问题。在运行时,将整个数组取零点的正确方法是使用MeSET——这是C++,其中可以使用<代码> ARR= { 0 }来完成数组的零化。
@PaulMcKenzie谢谢,我有C语言背景,但我不知道。我编辑了我的答案,也包括了你的解决方案。@PaulMcKenzie-你确定吗?使用gcc和
-std=C++14
我从初始值设定项列表中得到了一个
分配给数组的错误。
字符串框1[n1];字符串框2[n2]不可用C++作为一个变量,不能用变量作为数组的数量来声明数组。使用<代码> STD::vector < /代码>。基本上,你已经声明了代码> int ARR(26)={ 0 };<代码> ARR < /代码>有<代码> 26 < /C>元素(从<代码> 0 < /代码>到<代码> 25 < /代码>)试图访问索引<代码> 26 < /COD>中的元素导致不正确的行为,并表示坏的或不正确的代码。<代码>字符串BX1[N1;字符串BX2[N2];这是无效的C++。不能使用变量作为项目数来声明数组。使用<代码> STD::vector < /代码>。基本上,您已经声明了代码> int ARR(26)={ 0 }。;
,因此
arr
26个
元素(从
0
25
),试图访问索引
26
中的元素会导致未定义的行为,并声明错误或不正确的代码。