C++ 未定义的行为或可能与memset有关
我试图在数组a中保存相当于32位数字的二进制。为了测试我的showbits函数,当我遇到这个问题时,我选择了8,9: 当我在函数showbits中放置memset时,我在代码中遇到了一个不合理的问题,我得到的是荒谬的整数,而我期望的输出是 0000000000000000000000000000 1000 这是8的二进制等价物。当我将memset放在main方法中时,它工作正常并提供正确的输出。我是否超出了边界?我看不到它 我的代码: 展品: 注意:我已将memset放在showbits中,但得到的答案不正确! 主要内容: 整个测试程序:C++ 未定义的行为或可能与memset有关,c++,undefined-behavior,C++,Undefined Behavior,我试图在数组a中保存相当于32位数字的二进制。为了测试我的showbits函数,当我遇到这个问题时,我选择了8,9: 当我在函数showbits中放置memset时,我在代码中遇到了一个不合理的问题,我得到的是荒谬的整数,而我期望的输出是 0000000000000000000000000000 1000 这是8的二进制等价物。当我将memset放在main方法中时,它工作正常并提供正确的输出。我是否超出了边界?我看不到它 我的代码: 展品: 注意:我已将memset放在showbits中,但得
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
void showbits(int A[32],int num)
{
int k=0;
memset(A,0,sizeof(A));
while(num>0)
{
A[k] = num&1;
k++;
num>>=1;
}
return ;
}
int main()
{
int A[32],i;
showbits(A,8);
for(i=31;i>=0;i--)
printf("%d",A[i]);
return 0;
}
当我将memset语句放在Main方法的showbits之前时,我得到了正确的输出
编辑
如果有人对我得到的东西感兴趣
398420075242008462686872420075219611920941961187434-22053366461961276109268692242
68672826866724200752000202903316219611874341961187478819611565142686716196182637
61961141748268665201000
方法中的A[32]实际上只是指向A的指针。因此,sizeof是*int的大小。采用以下测试代码:
void szof(int A[32])
{
std::cout << "From method: " << sizeof(A) << "\n";
}
int main(int argc, char *argv[])
{
int B[32];
std::cout << "From main: " << sizeof(B) << "\n";
szof(B);
return 0;
}
因此,memset设置的位比您想象的少。方法中的A[32]实际上只是指向A的指针。因此,sizeof是*int的大小。使用以下测试代码:
void szof(int A[32])
{
std::cout << "From method: " << sizeof(A) << "\n";
}
int main(int argc, char *argv[])
{
int B[32];
std::cout << "From main: " << sizeof(B) << "\n";
szof(B);
return 0;
}
因此,memset设置的位比您想象的要少。您必须通过引用传递一个
void showbits(int (&A)[32],int num)
有关更多详细信息,请参见此处:您必须通过引用传递
void showbits(int (&A)[32],int num)
有关更多详细信息,请参见此处:Avi已在代码中解释了问题。另一种可能的解决方案是使用C++风格的数组,而不是C风格的数组和memset。那么就不可能出现memset长度错误。而且没有性能损失
#include <array>
void showbits(std::array<int, 32> &A, int num)
{
A = {}; // set all entries to 0
// ...
}
int main()
{
std::array<int, 32> A;
// ...
}
Avi已经在你的代码中解释了这个问题。另一种可能的解决方案是使用C++风格的数组,而不是C风格的数组和memset。那么就不可能出现memset长度错误。而且没有性能损失
#include <array>
void showbits(std::array<int, 32> &A, int num)
{
A = {}; // set all entries to 0
// ...
}
int main()
{
std::array<int, 32> A;
// ...
}
我从来没有想过这个方向!格雷蒂从来没有想过这个方向!格雷托:对不起,你说得对。我将尝试编辑我的答案。@Avi请原谅,我认为在这种情况下,sizeofA将返回128,这是我们所期望的。指针与引用不同。如果A被声明为*int,那么它sizeofA返回机器的单词大小。我不知道,当我尝试执行他所说的操作时,我得到了正确的输出!当我试图在showbits函数中打印A的大小时,它确实给出了真实A的正确大小,即128字节@user4581301@ShubhamSharma是的,没错。我也在我的机器上尝试了这个,它给出了预期的结果。我在标记Avi上的错误,我的评论应该指向@user4581301Oh抱歉,你是对的。我将尝试编辑我的答案。@Avi请原谅,我认为在这种情况下,sizeofA将返回128,这是我们所期望的。指针与引用不同。如果A被声明为*int,那么它sizeofA返回机器的单词大小。我不知道,当我尝试执行他所说的操作时,我得到了正确的输出!当我试图在showbits函数中打印A的大小时,它确实给出了真实A的正确大小,即128字节@user4581301@ShubhamSharma是的,没错。我也在我的机器上尝试了这个,它给出了预期的结果。我在标记Avi上的错误,我的评论应该指向@user4581301