C ++代码中的错误:将一个变量设置为零会导致无关变量变为零

时间:2016-09-27 01:17:24

标签: 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;
    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;
}

任何人都可以解释错误:

arr [26] = {0};

1 个答案:

答案 0 :(得分:3)

您将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代码。