char *p="123"与char p[]="123"的区别???

rockhard 2001-06-01 10:57:00
下面是我写的一个简单的测试程序:

#include<iostream.h>
#include<string.h>

void main(void)
{
char *p;
char * aa(void);
p=aa();
char *p1=(char *) new char[100];//以下两行原本想覆盖掉p,呵呵,但没成功
memset(p1,'*',100*sizeof(char));
delete[] p1;
cout<<p<<endl;

}
char * aa()
{
char *temp="abcdefghijk";//改为char temp[]="abcdefghijk";后有问题
return temp;
}

问题是如果是temp[]有下面的警告
E:\test\pointer\a.cpp(18) : warning C4172: returning address of local variable or temporary
且输出也不对了,但象程序那样写就没问题了,我想问一下它们的区别在哪儿?难道char *temp定义的temp不是局部变量??


...全文
660 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
lmycs 2001-07-07
  • 打赏
  • 举报
回复

char *p;
char * aa(void);
p=aa();//相当于p="abcdefghijk";指针地址本身的值赋值
cout<<p<<"p address:"<<&p<<endl;
p="fijefiewufe";
cout<<p<<"p address:"<<&p<<endl;

输出的是指针p的地址而不是他的内容(即他所指向的内容的地址),可用debug看:
p初值为:0xcccccccc
aa()后为:0x00425028
p="fijefiewufe"后:0x0042501c

rockhard 2001-06-01
  • 打赏
  • 举报
回复
to asia():
我看了好长时间,都快整晕了,麻烦你再说说:
char *temp="abcdefghijk";的意思是:指针内存的初始化,即:指针地址本身的值:temp==abcdefghijk;abcedefghijk是什么进制的值呀??系统怎么能认识?
asia 2001-06-01
  • 打赏
  • 举报
回复
to rockhard(硬石) 

#include<iostream.h>
#include<string.h>

void main(void)
{
char *p;
char * aa(void);
p=aa();//相当于p="abcdefghijk";指针地址本身的值赋值
cout<<p<<endl;
p="fijefiewufe";
//char *p1=(char *) new char[100];以下两行原本想覆盖掉p,呵呵,但没成功
//memset(p1,'*',100*sizeof(char));
//delete[] p1;
cout<<p<<endl;

}
char * aa()
{
char *temp="abcdefghijk";//改为char temp[]="abcdefghijk";后有问题
return temp;
}

仔细研究这对程序:
p=aa();//相当于p="abcdefghijk";指针地址本身的值赋值
cout<<p<<endl;
p="fijefiewufe";
cout<<p<<endl;
你就知道其中的道理了!!!rockhard(硬石)所说是说了其中的一部分!!!是说了const说明部分!!!
asia 2001-06-01
  • 打赏
  • 举报
回复
to rockhard(硬石) 
char *temp="abcdefghijk";与char temp[]="abcdefghijk";是不同的意思:
char *temp="abcdefghijk";的意思是:指针内存的初始化,即:指针地址本身的值:temp==abcdefghijk。char temp[]="abcdefghijk";指向的数据内存的初始化,即:指针指向的值temp[0]==a;temp[1]==b;.......temp[10]=k;temp[11]='\0';temp[]="abcdefghijk"当函数运行时,它在栈里面,当函数运行完毕,释放。temp=“abcdefghijk";当函数运行时把地址的值放入栈,当函数运行完毕,把值abcdefghijk返回出来,p=aa();指针内存的初始化,即:指针地址本身的值p==abcdefghijk,如何???不懂再问!!!!请看看c++的指针的章节!!!
cber 2001-06-01
  • 打赏
  • 举报
回复
rockhard(硬石):
具体的你还是应该自己看一看有关操作系统的书籍.我要在这里讲会很累的;-)
其实我在这里所讲的东西已经属于很深入的一些内容了,对于你的程序来说,可能并不需要知道那么多,你只需要知道不要让函数返回其内部定义的局部变量的指针就行了.
rockhard 2001-06-01
  • 打赏
  • 举报
回复
to cber(cber):
果然是如你所说的那样,我在aa()返回后加了一句strcpy(p,"aaa");程序运行时就发生了非法指令错误。
不过我想再问一下,你说“说明这个数据段可以在不被使用时被操作系统从内存中调出去”是不是操作系统给我分配了空间后还看我后面的程序代码是不是还要用?如果系统不管我后面的代码会不会用到这个空间,只要我程序退出时才释放的话,那它是不是得记住每个程序在overlap段中分配的数据且是由谁分配的?是不是这样呀?
millet 2001-06-01
  • 打赏
  • 举报
回复
to rockhard(硬石)

那个字符串"abcdefghijk"不释放的。一直在内存里面。

to holyfire(因为我手快所以我抢先用了水神这个昵称)
可能编译器是在运行aa()时,从堆里面划一块内存
~~~
是栈吧

呵呵,我又搞错了,好象确实是栈。
这个temp[]="abcdefghijk"相当于是在函数里面静态分配的字符串。当函数运行时,它在栈里面,当函数运行完毕,它和函数一起从栈里面弹出。就相当于释放了。
用什么malloc,new之类的分配的内存才是从堆里面分配的。

是这样的吧?
cber 2001-06-01
  • 打赏
  • 举报
回复
overlap是操作体统里面所说的覆盖的意思.说明这个数据段可以在不被使用时被操作系统从内存中调出去,求而代之的是另外的一个overlap段.它不等同于我们通常讨论的heap,stack,register等用以存放对象的其他空间,在它里面的数据一般是不能被更改的.
具体的说明你可以去看一些有关操作系统方面的书籍.
asia 2001-06-01
  • 打赏
  • 举报
回复
char *p1=(char *) new char[100];//以下两行原本想覆盖掉p,呵呵,但没成功
memset(p1,'*',100*sizeof(char));
delete[] p1;
这些语句意思就是分配一个char的指针与指向的char的数据内存(*p1),把数据内容复制为‘*',在删除char的指针与指向的char的数据内存(*p1)。char *p是分配一个char的指针内存与*P1是不会重复的。他们指向不同的数据内存。所以以上语句与char *p根本与关系,不可能覆盖掉p。
rockhard 2001-06-01
  • 打赏
  • 举报
回复
@_@ 以焦急关注的目光希望大家能指点
rockhard 2001-06-01
  • 打赏
  • 举报
回复
to millet(小米):
你说放在一个固定的地方,那
char * aa()
{
char *temp="abcdefghijk";
return temp;
}
中的temp在函数返回时肯定还没释放是不是?那由谁来释放?什么时候释放?
rockhard 2001-06-01
  • 打赏
  • 举报
回复
to holyfire:

如果是从堆里划一块内存,char *temp="abcdefghijk";结果总是对的?且编译时没有警告?
rockhard 2001-06-01
  • 打赏
  • 举报
回复
呵呵,我的本意是这样的,我想如果函数aa()返回了,那么char temp[]或者char *temp的空间应该释放了才对。所以我看看能不能立即把他分配给p1,如果分给了p1,则cout<<p<<endl;应该输出*****什么的才对!呵呵办法笨了点。也不知道window到底怎么分配的?是不是把我刚释放的空间紧接着分给另外需要空间的变量??
holyfire 2001-06-01
  • 打赏
  • 举报
回复
可能编译器是在运行aa()时,从堆里面划一块内存
~~~
是栈吧
millet 2001-06-01
  • 打赏
  • 举报
回复
具体我没有实验过,如果对于你那种情况,
我想对于
char * aa()
{
char *temp="abcdefghijk"; return temp;
}
编译器把字符串事先放在某个固定的地方,然后当执行char * aa()时,把字符串地址回送。


char * aa()
{
char temp[]="abcdefghijk";
return temp;
}
可能编译器是在运行aa()时,从堆里面划一块内存,然后赋值。再回传地址。当函数运行结束返回时,该内存又被释放掉了。这样返回的指针所指向的地址又被别的代码使用。然后。。。。。。
以上是我的一点想法。希望高手指正。 呵呵

顺便问一下,你的这3句代码有什么用?它们先分配了一块内存,然后赋值,然后就释放掉。
什么有意义的事情都没干啊!
char *p1=(char *) new char[100];//以下两行原本想覆盖掉p,呵呵,但没成功
memset(p1,'*',100*sizeof(char));
delete[] p1;
rockhard 2001-06-01
  • 打赏
  • 举报
回复
overlap数据段主要用来干什么的?像这样strcpy(des,"aaa");aaa是不是也分在overlap段中
cber 2001-06-01
  • 打赏
  • 举报
回复
char *p = "123",p是一个const char* const,有可能被编译器放置在overlap数据段中
char p[] = "123",p是一个char*,一般被编译器放置在普通的数据段中

在XC中对此有一些讨论

你的问题是返回了函数内部定义的局部变量的值,它们会在函数退出时变为无效的值.这一点好像在EC中有讨论(我已经很久没有看它了,不知道还有没有记清楚^_^)
rockhard 2001-06-01
  • 打赏
  • 举报
回复
指针内存的初始化不知是不是指:初始化指针变量,(就象int aa=5;初始化aa一样)
指向的数据内存的初始化:我的理解是初始化指针变量指向的那个变量,不知对不对,也望指教!
“指针p”:我想说是指这个变量的本身p,没别的意思吧。
“指针地址p”:这个……嗯,我也不太明白。
stonechina 2001-06-01
  • 打赏
  • 举报
回复
to asia()

asia 大哥我可真被你的名词搞晕了:"指针内存的初始化";”指向的数据内存的初始化“;“指针p”;“指针地址p”
可能还是小弟火候不到吧

rockhard 2001-06-01
  • 打赏
  • 举报
回复
这次分数少了点,全给了asia(),请别的兄弟多多包涵,下次补上。
加载更多回复(23)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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