C++ C+中的Bug+;代码:将一个变量设置为零会导致不相关的变量变为零
为什么在执行语句arr[26]={0}之后,下面代码中变量n2的值变为0,(我在调试时意识到了这一点) 而memset(arr,0,sizeof(arr));工作完美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
#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
中的元素会导致未定义的行为,并声明错误或不正确的代码。