问题:指针为什么使用前要进行初始化及相关例子
2013-04-21 15:54
337 查看
很多函数虽然是以指针为参数,但是空间是需要用户分配的。
未经过初始化的指针或者已被delete掉的指针,叫做野指针。
不初始化也能通过编译器,但指针指向哪里,你根本不知道,如果指向的是内存中比较重要的地方,可能会导致系统异常,如有时电脑会提示指向了一个不可用的地址之类的错误。
定义一个指针的时候,可以在声明语句中初始化指针,此时被初始化的是指针,而不是它指向的值。由于有宏定义 #define NULL 0 ,可以初始化为NULL,或者new个内存给它也好。总之,必须是一个可以控制的值。
产生野指针的情况:
一.指针变量没有被初始化
二.指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针
三.指针操作超越了变量的作用范围
指针的危险:
在C++中创建指针时,计算机将分配用来存储地址的内存,但并不管分给地址的4个字节中开始时存的是什么值,如下所示:
long* fellow;
*fellow = 223323;
fellow确实是一个指针,但是它开始时指向哪里/存储的是什么呢?由于fellow没有被初始化,它可能有任何值。如果fellow的值碰巧是1200,计算机将把数据放在地址1200上,即使这恰巧是程序代码的地址。fellow指向的地方很可能并不是所要存储223323的地方。这种错误可能会导致一些最隐匿、最难以跟踪的bug。
具体例子:
例1:
int main()
{
char a[]="hello";
char *str; //注意这里没有初始化,直接这样运行,会提示Debugger Exception Notification的系统错误,需将此行改为
strcpy(str,a); //char *str = new char[20];,程序才可正确运行
printf("%s,%s\n",a,str);
return 0;
}
例2:在.h文件中定义指向类对象的指针,在.cpp文件中必须new出相应的内存空间给它,使用时才不会出错。
未经过初始化的指针或者已被delete掉的指针,叫做野指针。
不初始化也能通过编译器,但指针指向哪里,你根本不知道,如果指向的是内存中比较重要的地方,可能会导致系统异常,如有时电脑会提示指向了一个不可用的地址之类的错误。
定义一个指针的时候,可以在声明语句中初始化指针,此时被初始化的是指针,而不是它指向的值。由于有宏定义 #define NULL 0 ,可以初始化为NULL,或者new个内存给它也好。总之,必须是一个可以控制的值。
产生野指针的情况:
一.指针变量没有被初始化
二.指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针
三.指针操作超越了变量的作用范围
指针的危险:
在C++中创建指针时,计算机将分配用来存储地址的内存,但并不管分给地址的4个字节中开始时存的是什么值,如下所示:
long* fellow;
*fellow = 223323;
fellow确实是一个指针,但是它开始时指向哪里/存储的是什么呢?由于fellow没有被初始化,它可能有任何值。如果fellow的值碰巧是1200,计算机将把数据放在地址1200上,即使这恰巧是程序代码的地址。fellow指向的地方很可能并不是所要存储223323的地方。这种错误可能会导致一些最隐匿、最难以跟踪的bug。
具体例子:
例1:
int main()
{
char a[]="hello";
char *str; //注意这里没有初始化,直接这样运行,会提示Debugger Exception Notification的系统错误,需将此行改为
strcpy(str,a); //char *str = new char[20];,程序才可正确运行
printf("%s,%s\n",a,str);
return 0;
}
例2:在.h文件中定义指向类对象的指针,在.cpp文件中必须new出相应的内存空间给它,使用时才不会出错。
相关文章推荐
- Java中final变量为什么在使用前必须要进行初始化
- 对指针进行初始化中的若干问题的思考与反思
- 为什么对于类的const成员,只能使用初始化列表,而不能在构造函数内部进行赋值操作
- C Primer plus 10.2 初始化一个double类型的数组,然后把该数组的内容拷贝至3个其它的数组中,使用带数组的表示方法的函数进行第一份拷贝,使用带指针表示方法和指针递增的函..
- 使用unity的Microphone接口进行录音时遇到的相关问题
- 对指针进行初始化中的若干问题的思考与反思
- ObjectARX中使用非模式对话框进行数据库操作时获取空指针问题
- 使用Mencoder进行视频转换遇到的问题和相关解决方案
- 安全指针使用的例子 (也有问题)
- 关于如何使用DirectX11进行编程的相关问题
- Android中使用友盟时用Ant进行多渠道打包及相关问题
- 使用Mencoder进行视频转换遇到的问题和相关解决方案
- 为什么在使用expect的过程中常常遇到spawn命令找不到的问题,谈谈我的例子
- 使用Mencoder进行视频转换遇到的问题和相关解决方案
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- MFC 线程创建在使用构造函数进行初始化线程的时候,创建线程实例了,但是线程并没有执行的问题
- C/C++中指针和引用之相关问题研究
- 排序例子2:使用sort()方法对数组进行排序
- 读书笔记 effective c++ Item 4 确保对象被使用前进行初始化
- 新版新浪微博api使用问题及相关解决办法