空指针访问问题
代码如下
class A
{
int i;
public:
int gt(){ return 1000; }
A(){i=0;};
~A();
protected:
private:
};
int main(int argc, char* argv[])
{
A* p=0;
int j = p-> gt();
printf( "%d!\n ",j);
return 0;
}
p是空指针,为什么调用不抱错。
[解决办法]
个人理解:
每个类的大小是成员变量的大小的和.
#include <stdio.h>
#include <iostream.h>
class A
{
public:
int gt(){ return 1000; }
int number;
int sum;
};
int main(int argc, char* argv[])
{
A* p;
cout < <sizeof(A) < <endl;
return 0;
}
结果为8 , 那成员函数呢, 他在类外, 几个对象共用类的函数,
A* p;
int j = p-> gt(); 相当于定义一个空指针, 指向一个函数, 然后通过指针访问这个函数(指向函数的指针)
但是如果
#include <stdio.h>
class A
{
public:
int gt(){ return 1000; }
int number;
int sum;
};
int main(int argc, char* argv[])
{
A* p;
int j = p-> number;
printf( "%d!\n ",j);
return 0;
}
这样几会出错, 因为每个对象的成员变量不是共用的(Static)除外...
要用成员变量的话必须构造一个空间, 所以
如果上面
A* p = new A()
...之后就正确了...
个人理解....
[解决办法]
((A*)0)-> 成员函数.
该成员函数:不涉及成员数据访问和不能是虚函数.
[解决办法]
1.编译连接时不报错
编译器不能在编译或是连接时对指针的合法性进行检测
2.调用时不报错
C++对类的函数和全局函数有这样的规定,调用类中的函数和调用一个全局函数不应该有效率问题,所以,一般而言,编译器会将类中的函数放到类外,将其变成全局函数,这是我们所不能看到的改变,在楼主这种情况下,如果不报错,我觉得可能是这样,p是一个A类型的,调用函数gt()时,会像调用一个全局函数一样,因为可以得到gt()的地址,这个地址在编译时就可以拿到,所以不报错,但是如果对A中的成员解除引用,就会报错,楼主可以试一下。
3.如果只是p-> number则应该不会报错,但是编译器会将这句跳过,不执行这句代码。
[解决办法]
int j = p-> gt();
因为,gt不是虚函数,因此被编译器翻译为:
A::gt( p )
这肯定不会挂,因为即便p没意义,这样的调用也不会出错的。
而在内部:
return 1000;
没有使用根本不存在的p,更不会挂了。
你来一个:
return i;
应该就会挂了~