相关疑难解决方法(0)

为什么这个指针为空

在 Visual Studio 中,成员变量的指针似乎在幕后是 32 位有符号整数(即使在 64 位模式下),并且在该上下文中空指针为 -1。所以如果我有一个类:

#include <iostream>
#include <cstdint>

struct Foo
{
    char arr1[INT_MAX];
    char arr2[INT_MAX];
    char ch1;
    char ch2;
};


int main()
{
    auto p = &Foo::ch2;
    std::cout << (p?"Not null":"null") << '\n';
}
Run Code Online (Sandbox Code Playgroud)

它编译并打印“null”。那么,是我造成了某种未定义的行为,还是编译器应该拒绝此代码而这是编译器中的错误?

编辑:

看来我可以保留“2 个INT_MAX数组加 2 个字符”模式,只有在这种情况下,编译器才允许我添加任意数量的成员,并且第二个字符始终被视为空值。见演示。如果我稍微改变了模式(比如在某个时候用 1 或 3 个字符而不是 2 个字符),它会抱怨这个类太大了。

c++ visual-studio language-lawyer

32
推荐指数
2
解决办法
1053
查看次数

C++中未初始化的变量行为

我检查过自己,我写了一个这样的程序

int main() {
 int i;
 cout << i;
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我运行了几次程序,结果一直都是一样的,零.我在C中尝试过,结果是一样的.

但我的教科书说

如果不初始化在函数内定义的变量,则变量值保持未定义.这意味着该元素将采用先前驻留在内存中该位置的任何值.

当程序总是为变量分配空闲内存位置时,这怎么可能?怎么可能是零以外的东西(我假设默认的空闲内存值为零)?

c++ initialization undefined-behavior

11
推荐指数
3
解决办法
9701
查看次数

为什么这句话:"未定义的行为意味着编译器可以做任何想做的事情"是真的吗?

具体参考:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p = 633 /

我是一名新的C++程序员,我目前正在学习未定义的行为及其对程序的影响.我特意链接到上面的博客,该博客说当发生未定义的行为时,任何事情都可能发生.

它特别提到了几次,当发生未定义的行为时,编译器可以允许任何事情发生.

具体是什么导致这种情况发生,为什么会发生?

c++ compiler-construction undefined-behavior

6
推荐指数
2
解决办法
321
查看次数

当我在C++中打印未初始化的变量时会发生什么?

为什么打印32767(或其他随机数)?什么是std::cout印刷品?为什么不NULL(或0)?

int main() 
{
    int a;
    std::cout << a;
}
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
2
解决办法
878
查看次数