关于指针初始化问题

mxmkeep 2009-04-18 11:34:38
#include<iostream>
using namespace std;

int main()
{
char* p2;
p2="123456";
char* p="123456";
cout<<p<<endl<<p2<<endl;
return 0;
}

------------------------------------
上面程序编译运行没错误,结果都是123456;
但是我是CSDN上看到有人写头一种
char* p2;
p2="123456";
有位大叔回复:你不要命啦!居然给一个野地址赋值;
------------------------------------
而我经常看到书上写char* p="123456";
------------------------------------
是不是两种初始化完全不一样?
第一种是赋值给一个随机地址
第二种是把指针指向常量存储区

不知道我猜的对不对
麻烦大家解答解答,谢谢!


...全文
1280 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
p233355750 2009-04-18
  • 打赏
  • 举报
回复
敝人以为,指针就是变量.
1.如果定义的时候不初始化,其值是随即的.
2.定义的时候初始化,也不说明给指针分配了地址.只能说明指针指向了一个地址.
这里.
char*p;
p="abc";
相当于
1>定义一个常量字符串"abc"
2>定义一个指针变量
3>把字符串"abc"的首地址赋给p
mxmkeep 2009-04-18
  • 打赏
  • 举报
回复
谢谢大家!
加分结贴!
0黄瓜0 2009-04-18
  • 打赏
  • 举报
回复
所谓野指针,是不是里边存放的是随机地址?
如果是的话,那所谓的随机,范围多大?
本程序?还是会指到其他程序的地方?
==============
随机,指任何值都有可能,虽然象vc这样的debug模式会给你初始化一个定值。
也许这样定义野指针好理解点,指指针变量里面存放了非法地址,对指针的操作自然是非法内存操作,结果自然错误。
保护模式下,程序使用的内存逻辑上是独立的,指针自然只能指到本程序使用的逻辑空间。
qq675927952 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 A_B_C_ABC 的回复:]
严格点说:
第一种:
char* p="123456";//定义并初始化,这是推荐的格式,即使不给一个有效的地址也最好赋为NULL。

第二种:
char* p2;//定义一个指针变量没有初始化,以后可能会操作野指针
p2="123456";//把一个有效的内存地址赋给一个指针变量,天经地义。如果和上一句中间没有操作p2的代码,可以看作和第一种写法等效,但这不是推荐的格式。

[/Quote]

up
你可以通过下面的代码得到证明。。。,


int main()
{
char* p2; //声明了p2指针,未分配内存
p2="123456"; //把p2 指向常量字符串,
char* p="123456"; //声明指针,同时把p2指向常量字符串,同样未分配内存
cout<<p<<endl<<p2<<endl;
// p[2]='2'; 因为这两个操作都是非法的
// p2[2]='2';
cout<<p[2]<<endl;
cout<<p2[2]<<endl;
system("pause");
return 0;
}



且一般编译器优化 ,会把 p和p2都指向同一个字符串
zgjxwl 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mxmkeep 的回复:]
先谢谢大家!
还有不懂的地方
所谓野指针,是不是里边存放的是随机地址?
如果是的话,那所谓的随机,范围多大?
本程序?还是会指到其他程序的地方?
[/Quote]
所谓的野指针。。就是个指针。里面就会存放着内存单元的地址。。所以一般要显示赋给它一个NULL
因为野指针你仍然是可以操作的。如果对野指针指向的内存块进行了修改。。指不定会发生什么事呢。
pengzhixi 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 A_B_C_ABC 的回复:]
3楼对指针的理解有点问题,或者是你本身理解,但表达出来就有问题。
4楼的“第一种是赋值给一个随机地址”这种所法也有问题。
[/Quote]

恩 确切的说第一种不是赋值,只是说为指针本身分配了内存,但是指针这块内存里面存放的地址是随即的。
mxmkeep 2009-04-18
  • 打赏
  • 举报
回复
先谢谢大家!
还有不懂的地方
所谓野指针,是不是里边存放的是随机地址?
如果是的话,那所谓的随机,范围多大?
本程序?还是会指到其他程序的地方?
zgjxwl 2009-04-18
  • 打赏
  • 举报
回复
两次操作都是把字符串的地址赋给字符指针。。
zgjxwl 2009-04-18
  • 打赏
  • 举报
回复
就是使指针指向字符串呀。。就如黄瓜所说的。不过这是个历史遗留问题。。
0黄瓜0 2009-04-18
  • 打赏
  • 举报
回复
3楼对指针的理解有点问题,或者是你本身理解,但表达出来就有问题。
4楼的“第一种是赋值给一个随机地址”这种所法也有问题。
0黄瓜0 2009-04-18
  • 打赏
  • 举报
回复
严格点说:
第一种:
char* p="123456";//定义并初始化,这是推荐的格式,即使不给一个有效的地址也最好赋为NULL。

第二种:
char* p2;//定义一个指针变量没有初始化,以后可能会操作野指针
p2="123456";//把一个有效的内存地址赋给一个指针变量,天经地义。如果和上一句中间没有操作p2的代码,可以看作和第一种写法等效,但这不是推荐的格式。
pengzhixi 2009-04-18
  • 打赏
  • 举报
回复
是不是两种初始化完全不一样?
第一种是赋值给一个随机地址
第二种是把指针指向常量存储区 //确切的说是更改了p2里面存放的地址,也就是说让p2里面存放的随即地址值变成字符串常量存放的地址
  • 打赏
  • 举报
回复

int main()
{
char* p2; //声明了p2指针,未分配内存
p2="123456"; //野指针操作
char* p="123456"; //声明指针,同时初始化数据,默认分配对应的内存
cout<<p<<endl<<p2<<endl;
return 0;
}

donle1000 2009-04-18
  • 打赏
  • 举报
回复
根据我的理解
在你创建一个指针的时候,按你这样写是没有重新分配空间给它的,即是说指向一个野地址.然后按照你这样的赋值,因为你是用指针对指针指向的变量操作,所以假如:这个野指针恰好指向的位置是你之前程序中定义的变量的位置,那么这样写的话,之前你所定义的变量的值也跟着被改变了,而这个改变的过程是隐式的,可能自己都没察觉.
所以在中指针的时候要new或者malloc
mxmkeep 2009-04-18
  • 打赏
  • 举报
回复
补充下:我学的是C++
回答时,如果是从C考虑,麻烦注明

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧