未定义的行为或可能是带有memset的东西
Undefined behaviour or may be something with memset
我试图在数组a中保存一个32位数字的二进制等价物。为了测试我的showbits()函数,当我遇到这个东西时,我选择了8,9:
当我在函数showbits()中放置memset时,我在代码中遇到了一个不合理的问题,我得到了荒谬的整数,而我期望输出
000000000000000000000000000
这是8的二进制等价物。当我把memset放在main()方法中时,它可以正常工作,并给我正确的输出。我是不是要出界了(我看不见!)。
我的代码:SHOWBITS:
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 ;
}
注意:我已将内存集放在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;
}
当我把memset语句放在showbits()之前的Main方法中时,我得到了正确的输出!
编辑如果有人对我得到的感兴趣
39842007522408462686872420075219611920941961187434-2205336646196127610926869242686728268667242007520002029033162196118743419611874788196115651468671619618263761961141748268665201000
方法中的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
因此,内存集设置的位比您想象的要少。
您必须通过引用传递A
void showbits(int (&A)[32],int num)
有关更多详细信息,请参阅此处:C++通过引用传递数组
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;
// ...
}
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 具有外部"c"和程序集的未定义函数
- 此增量后语句是否会导致未定义的行为?
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 未定义的行为或可能是带有memset的东西