未定义的行为或可能与 memset 有关
Undefined behaviour or may be something with memset
我试图在数组 A 中保存 32 位数字的二进制等价物。为了测试我的 showbits() 函数,当我遇到这个东西时我选择了 8,9:
当我在函数 showbits() 中放置 memset 时,我在我的代码中遇到了一个不合理的事情,我得到了荒谬的整数,而我期望输出为
00000000000000000000000000001000
这是 8 的二进制等价物。当我将 memset 放在 main() 方法中时,它可以正常工作并为我提供正确的 output.Am 我越界(我看不到它!)。
我的代码:
展示位:
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 ;
}
注意: 我已经将 memset 放在 showbits 中,但我得到的答案不正确!
主线:
int main()
{
int A[32],i;
showbits(A,8);
for(i=31;i>=0;i--)
printf("%d",A[i]);
return 0;
}
整个测试程序:
#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;
}
当我在 showbits() 之前的 Main 方法中放置该 memset 语句时,我得到了正确的输出!
编辑
如果有人对我得到的东西感兴趣
398420075242008462686872420075219611920941961187434-2205336646196127610926869242
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;
}
给出以下输出:
From main: 128
From method: 8
因此,memset 设置的位数比您想象的要少。
你必须通过引用A
void showbits(int (&A)[32],int num)
详情请看这里:C++ pass an array by reference
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;
// ...
}
我试图在数组 A 中保存 32 位数字的二进制等价物。为了测试我的 showbits() 函数,当我遇到这个东西时我选择了 8,9:
当我在函数 showbits() 中放置 memset 时,我在我的代码中遇到了一个不合理的事情,我得到了荒谬的整数,而我期望输出为
00000000000000000000000000001000
这是 8 的二进制等价物。当我将 memset 放在 main() 方法中时,它可以正常工作并为我提供正确的 output.Am 我越界(我看不到它!)。
我的代码: 展示位:
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 ;
}
注意: 我已经将 memset 放在 showbits 中,但我得到的答案不正确! 主线:
int main()
{
int A[32],i;
showbits(A,8);
for(i=31;i>=0;i--)
printf("%d",A[i]);
return 0;
}
整个测试程序:
#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;
}
当我在 showbits() 之前的 Main 方法中放置该 memset 语句时,我得到了正确的输出!
编辑 如果有人对我得到的东西感兴趣
398420075242008462686872420075219611920941961187434-2205336646196127610926869242 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;
}
给出以下输出:
From main: 128
From method: 8
因此,memset 设置的位数比您想象的要少。
你必须通过引用A
void showbits(int (&A)[32],int num)
详情请看这里:C++ pass an array by reference
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;
// ...
}