如何将指针(Object *ob)传递给原型的函数void foo(Object &)?
请考虑以下代码:
#include <iostream>
struct foo
{
// (a):
void bar() { std::cout << "gman was here" << std::endl; }
// (b):
void baz() { x = 5; }
int x;
};
int main()
{
foo* f = 0;
f->bar(); // (a)
f->baz(); // (b)
}
Run Code Online (Sandbox Code Playgroud)
我们期望(b)崩溃,因为x空指针没有相应的成员.在实践中,(a)不会崩溃,因为this从不使用指针.
因为(b)取消引用this指针((*this).x = 5;),并且this为null,程序进入未定义的行为,因为取消引用null总是被称为未定义的行为.
会(a)导致未定义的行为吗?如果两个函数(和x)都是静态的呢?
c++ standards-compliance null-pointer undefined-behavior language-lawyer
这段代码是否有效(和定义的行为)?
int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)
这两个g ++以及铛++编译它没有任何警告,即使使用-Wall,-Wextra,-std=c++98,-pedantic,-Weffc++...
当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:
if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud) 我试图想出一个具体的推理,为什么要在引用上使用指针作为函数的返回类型,
我的理由是,如果无意中将null值返回给引用类型,则无法检查它,并可能导致运行时错误
int& something(int j)
{
int* p = 0 ;
return *p;
}
void main()
{
int& i = something(5);
i = 7; // run-time error
}
Run Code Online (Sandbox Code Playgroud)
如果我使用了指针,我可以检查它并避免错误,指针返回值将作为合同,必须返回一个值.
void main()
{
int* i = something(5);
if( i != null )
*i = 7;
}
Run Code Online (Sandbox Code Playgroud)
任何想法将再次受到赞赏,
你会用什么以及为什么引用或指针
提前致谢.
说我有班级:
class A
{
public:
void foo() { cout << "foo"; }
};
Run Code Online (Sandbox Code Playgroud)
并像这样调用foo:
A* a = NULL;
a->foo();
Run Code Online (Sandbox Code Playgroud)
我怀疑这会调用未定义的行为,因为它等同于(*a).foo()(或者它是?),并且取消引用a NULL 是 UB,但我找不到引用.谁能帮我吗?还是定义了?
不,功能不是virtual.不,我没有访问任何成员.
编辑:我投票结束这个问题,但不会删除它,因为我自己找不到副本,我怀疑这个标题可能更容易被其他人找到.
#include <iostream>
int main()
{
int* i = 0;
int x = (*i);
std::cout << x;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行它时,上面的程序将崩溃Visual Studio 2010,我知道它崩溃,因为我将指针设置为0.
我想知道的是,访问null pointer标准中定义的C++,还是未定义的,我很幸运,因为我的编译器/计算机/操作系统,我的程序崩溃了
如果定义了,当我尝试访问空指针时C++会保证什么?
我有一个非常古老的(和巨大的)Win32项目,该项目使用NULL指针进行大量检查,通过强制转换为指向解除引用的指针.像这样:
int* x = NULL; //somewhere
//... code
if (NULL == &(*(int*)x) //somewhere else
return;
Run Code Online (Sandbox Code Playgroud)
是的,我知道这段代码很愚蠢,需要重构.但由于代码量很大,这是不可能的.现在我需要在Xcode的MacOS Sierra下编译这个项目,这会导致很大的问题......事实证明,在发布模式下(使用代码优化),条件以不正确的行为执行(因为解除引用NULL而被称为未定义的行为指针).
根据GCC的这个文档,有一个选项-fno-delete-null-pointer-checks,但是当启用O1,O2或O3优化时,它似乎不适用于LLVM.所以问题是:如何强制LLVM 8.0编译器允许这样的解引用?
UPDATE.检查问题的真实工作示例.
//somewhere 1
class carr
{
public:
carr(int length)
{
xarr = new void*[length];
for (int i = 0; i < length; i++)
xarr[i] = NULL;
}
//some other fields and methods
void** xarr;
int& operator[](int i)
{
return *(int*)xarr[i];
}
};
//somewhere 2
carr m(5);
bool something(int i)
{
int* el = &m[i]; …Run Code Online (Sandbox Code Playgroud) 很简单的问题,但我在网上找不到任何解决方案.
是否有可能迫使Qt应用程序崩溃?
这仅用于开发目的,因为我想试验崩溃报告.
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
Run Code Online (Sandbox Code Playgroud)
为什么这段代码会给我一个运行时错误?
在代码块(C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int *p;
cout<<*p;
}
Run Code Online (Sandbox Code Playgroud)
产生垃圾价值,而
#include<bits/stdc++.h>
using namespace std;
int main(){
int *p=NULL;
cout<<*p;
}
Run Code Online (Sandbox Code Playgroud)
导致运行时错误.我预计两者的运行时错误(ideone会为两者产生运行时错误),因为两者都是错误的指针.怎么能解释这个呢?
c++ ×10
pointers ×5
reference ×3
null ×2
null-pointer ×2
casting ×1
clang++ ×1
dereference ×1
qt ×1
qt5 ×1