读书人

编译器为什么不把c++指针的初始值默认

发布时间: 2012-03-15 11:50:38 作者: rapoo

编译器为什么不把c++指针的初始值默认为null
在类里定义指针变量,然后都要跑到构造函数里把定义的指针赋为null,感觉很麻烦,
为什么编译器不给指针提供一个默认值呢?

[解决办法]
嘿嘿!
这个问题...也许不同的编译器有不同的处理方式
[解决办法]
因为“规定”
难道你要问1+1为什么不等于3?
[解决办法]
既然有构造函数,就说明得按构造函数说的构造
如果没有构造函数,就生成构造函数.
[解决办法]
用别人的 就得按别人的思路,除非你有自己的
[解决办法]

引用楼主 lp3331 的帖子:
在类里定义指针变量,然后都要跑到构造函数里把定义的指针赋为null,感觉很麻烦,
为什么编译器不给指针提供一个默认值呢?

[解决办法]
oo
[解决办法]
引用楼主 lp3331 的帖子:
在类里定义指针变量,然后都要跑到构造函数里把定义的指针赋为null,感觉很麻烦,
为什么编译器不给指针提供一个默认值呢?

[解决办法]
我想问一句,为什么要把指针变量赋为NULL呢?
这难得不是程序员理所当然要去做的事情吗?
[解决办法]
就算给你个默认值有什么用?
难道你会不初始化就使用它么?
呵呵
[解决办法]
我觉得LZ的建议,很有建设性
编译器给没初始化的指针赋NULL要好过胡乱给值(虽然好多编译器都没有这样做)

[解决办法]
pointer不是建型数据吧。。

就算是建型数据,初始化一下不是更清析末?
[解决办法]
jf
[解决办法]
探讨
引用:
因为“规定”
难道你要问1+1为什么不等于3?

那int,double默认值为0,是不是也没有什么原因~

[解决办法]
因为要兼容C
[解决办法]
因为要兼容C,就这么简单。
[解决办法]
探讨
引用:
因为“规定”
难道你要问1+1为什么不等于3?


那int,double默认值为0,是不是也没有什么原因~

[解决办法]
C,C++程序员的哲学是,程序员知道自己在做什么,编译器从不过分的干预程序员,所以.....
[解决办法]
大多数情况下指针变量在栈上分配内存,编译器在分配变量的空间时只是简单移动栈的指针,这样在栈上声明多个变量就来得很快速,进行一次栈指针的移动就可以了,而再读写内存意味着效率将会损失,并且初始化的内容很快就会被改变
[解决办法]
探讨
大多数情况下指针变量在栈上分配内存,编译器在分配变量的空间时只是简单移动栈的指针,这样在栈上声明多个变量就来得很快速,进行一次栈指针的移动就可以了,而再读写内存意味着效率将会损失,并且初始化的内容很快就会被改变

[解决办法]
c++ 可不是傻瓜型的语言,它从来不会自作聪明地认为客户需要什么就招呼也不打地帮人做了。

如果你需要傻瓜语言,有很多可供选择,即使是你坚持要 C++ 语法的也有 Java 和 C# 给你用。


[解决办法]
bool变量呢???
[解决办法]
如果默认指向NULL,那么编译器会认为你这个指针是被引用过的(referenced),
那么就算你定义好这个指针后,再也没用用过,编译器也不会给你WARNING

如果不默认指针为NULL,那么如果你不用这个指针,编译器就会找到这个错误,比如
unreferenced local variable
那么你就能知道你定义一个没有用过的指针。
------解决方案--------------------


好像gcc就是初始化为null的。
[code = C/C++]
#include <iostream>
using namespace std;

class TT
{
public:
char* p1;
char* p2;
};

int main(int argc, char* argv[])
{
TT s;
printf("p1=%p, p2 = %p", s.p1, s.p2);

return 0;
}
[/code]
[解决办法]

探讨
引用:
引用:
因为“规定”
难道你要问1+1为什么不等于3?

那int,double默认值为0,是不是也没有什么原因~
其实变量和指针,编译器都是平等对待的。VC中,全局变量初始化为0,全局指针初始化为NULL;局部变量(包括指针变量)如果未显式初始化,其值都是未定的。

C/C++ codeint* a; //编译器默认初始化为NULL
void main()
{
int* b; //编译器不会默认初始化,并…

[解决办法]
探讨
大多数情况下指针变量在栈上分配内存,编译器在分配变量的空间时只是简单移动栈的指针,这样在栈上声明多个变量就来得很快速,进行一次栈指针的移动就可以了,而再读写内存意味着效率将会损失,并且初始化的内容很快就会被改变

[解决办法]
探讨
好像gcc就是初始化为null的。

C/C++ code
#include <iostream>
using namespace std;

class TT
{
public:
char* p1;
char* p2;
};

int main(int argc, char* argv[])
{
TT s;
printf("p1=%p, p2 = %p", s.p1, s.p2);

return 0;
}

[解决办法]
这个问题听来很自卑阿,外国人搞得东西,它想怎么就怎么,除非那天你去搞个,你还可以让他默认为this呢
[解决办法]
探讨
引用:
因为“规定”
难道你要问1+1为什么不等于3?


那int,double默认值为0,是不是也没有什么原因~

[解决办法]
类中定义的指针,在定义时根本没有实例,怎么初始化。
类外定义的指针,不是全局的,不初始化是为了效率。
[解决办法]
为什么要初始化?这是程序员应该做的!
[解决办法]
探讨
大多数情况下指针变量在栈上分配内存,编译器在分配变量的空间时只是简单移动栈的指针,这样在栈上声明多个变量就来得很快速,进行一次栈指针的移动就可以了,而再读写内存意味着效率将会损失,并且初始化的内容很快就会被改变

[解决办法]
学习
[解决办法]
探讨
如果默认指向NULL,那么编译器会认为你这个指针是被引用过的(referenced),
那么就算你定义好这个指针后,再也没用用过,编译器也不会给你WARNING

如果不默认指针为NULL,那么如果你不用这个指针,编译器就会找到这个错误,比如
unreferenced local variable
那么你就能知道你定义一个没有用过的指针。

[解决办法]
探讨
引用:
引用:
因为“规定”
难道你要问1+1为什么不等于3?


那int,double默认值为0,是不是也没有什么原因~

兄弟,哪学来的int,double默认值为0?

[解决办法]
我想这应该和全局变量放在静态存储区 有关系
[解决办法]
赞赏楼主这种求知和问疑精神!
不明白的地方就要搞清楚.不能认为C++的作者就是神!
目前 21楼的回答比较令人满意!(看来没有给NULL是有原因的)
[解决办法]
可以在分配变量空间的同时初始化嘛,一个一个得来。不必空间都分配完,在初始化。
[解决办法]
探讨
引用:
好像gcc就是初始化为null的。

C/C++ code
#include <iostream>
using namespace std;

class TT
{
public:
char* p1;
char* p2;
};


int main(int argc, char* argv[])
{
TT s;
printf("p1=%p, p2 = %p", s.p1, s.p2);

return 0;
}

这个如果是0,那是巧合


[解决办法]
探讨
引用:
引用:
好像gcc就是初始化为null的。

C/C++ code
#include <iostream>
using namespace std;

class TT
{
public:
char* p1;
char* p2;
};

int main(int argc, char* argv[])
{
TT s;
printf("p1=%p, p2 = %p", s.p1, s.p2);

return 0;
}

这个如果是0,那是巧合


换O2优化,可能就不是了吧


[解决办法]
当然, 如果这是偶然现象或者说巧合也是完全可能的。
反正是不能指望编译器的初始化的。
[解决办法]
问这个问题,说明你并不明白程序在计算机里运行的原理。

显然,是基于效率的考虑。
[解决办法]
真是的,这是不是问题的问题!
[解决办法]
探讨
你可以自己试试, 我试过开O3优化也是null, 如果你定义一个 int i; 这样的局部变量, 出现的值一般都不是0。
但是在类中的成员变量, 则都是0, 指针就都是null。

[解决办法]
还有一种可能是和测试代码的上下文有关。

或许在main函数的开始部分,栈中原本的值就是0(依赖于实现)。可以用更复杂的代码去测试:是否真得做了0初始化。例如:
C/C++ code
#include <iostream> using namespace std; class TT { public:     char* p1;     char* p2; };void func(){    char c;    TT s;         printf("p1=%p, p2 = %p\n", s.p1, s.p2);               s.p1 = &c;    s.p2 = s.p1+10;} int main(int argc, char* argv[]) {     func();    func(); // 0 too ?     return 0; }
[解决办法]
探讨
引用:
引用:
引用:
好像gcc就是初始化为null的。

C/C++ code
#include <iostream>
using namespace std;

class TT
{
public:
char* p1;
char* p2;
};

int main(int argc, char* argv[])
{
TT s;
printf("p1=%p, p2 = %p", s.p1, s.p2);

return 0;
}

这个如果是0,那是巧合


换O2优化,可能就不是了吧…

[解决办法]
可能你的环境,栈里面全是0吧。。
[解决办法]
C++的法则是:你不必为自己不使用的东西负出多余的代价。

读书人网 >C++

热点推荐