我已经看过使用ZeroMemory的示例(主要是使用windows和directx结构),但有时却没有使用它.我什么时候应该ZeroMemory结构?
在阅读本文时,我看到了一个我不了解的UB,希望您能澄清一下
size_t f(int x)
{
size_t a;
if(x) // either x nonzero or UB
a = 42;
return a;
}
Run Code Online (Sandbox Code Playgroud)
我猜UB是由于a没有初始化的值,但这不是它定义的行为吗?意思是,无论f(0)变量a是什么, 都将返回其所保存的值(我认为这类似于rand())。我们是否必须知道代码片段返回的值使代码具有明确定义的行为?
我是 C/C++ 新手,我注意到我的程序计算了错误的值。我发现问题在于我对 C/C++ 中变量声明的工作方式的理解。
x,y,z = 1,2,3在 Python 中工作正常,而 asx,y,z = 1则不然。
int x,y,z = 1,2,3不能在 C/C++ 中工作,但int x,y,z = 1可以,因为cout << x;输出 16,我预计它是 1。
#include <iostream>
using namespace std;
int main() {
int x, y, z = 1;
cout << x;
return 0;
}
// The output is 16
Run Code Online (Sandbox Code Playgroud)
int x,y,z = 1如果不为每个分配 1,则操作在做什么?
我多次听说过,如果你没有初始化变量,那么garbage value就存储在变量中.
说
int i;
printf("%d",i);
Run Code Online (Sandbox Code Playgroud)
上面的代码打印任何垃圾值,但我想知道如果未初始化,存储垃圾值需要什么?
因此下面的代码.
class A
{
int x;
public:
A() {x = 3;}
};
int main()
{
void* mem = operator new(sizeof(A));
A* obj = static_cast<A*>(new(mem)(A));
std::cout << obj->x << std::endl;
obj->A::~A();
std::cout << obj->x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是:为什么我可以直接调用A的析构函数; 我的第二个问题是:为什么输出是:
3
3
Run Code Online (Sandbox Code Playgroud)
在析构函数调用后,对象obj不会被删除?第二个困扰我.
我有以下代码片段.
int j;
printf("%d",j);
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我得到了垃圾值.
32039491
但是当我在上面的代码片段中包含一个循环时,就像
int j;
print("%d",j);
while(j);
Run Code Online (Sandbox Code Playgroud)
我在该程序的多次试验中得到以下输出.
0
我一直认为局部变量默认初始化为垃圾值,但看起来变量在使用循环时会自动初始化.
我们知道它可以用Java和JavaScript.
但问题是,可以在下面的条件永远评估为true 在C或C++?
if(a==1 && a==2 && a==3)
printf("SUCCESS");
Run Code Online (Sandbox Code Playgroud)
编辑
如果a是整数.
我故意试图在C中获取NULL指针,但我没有这样做.这是我编码的内容:
int main(void) {
int x; //UNINITIALIZED so that it will represent "nothing"
int *null_test = &x;
printf("This should be null %p \n", null_test);
}
Run Code Online (Sandbox Code Playgroud)
但它给了我一个地址:0x7fd96c300020这似乎NULL不像我希望的那样.
为什么?我甚至没有初始化x但仍然不是null?
我正在使用Valgrind来调试我的代码,当我struct通过比较来测试是否初始化时,我会收到警告NULL.
void main()
{
int *unassignedPointer;
if(unassignedPointer == NULL)
printf("This Pointer is NULL\n");
}
Run Code Online (Sandbox Code Playgroud)
此代码编译并运行,但是当通过Valgrind运行时,它会发出警告:条件跳转或移动取决于未初始化的值.与之比较的重点NULL是确定它是否已初始化.这是一种危险的做法,还是应该忽略这些警告?