关于在栈上分配的内存?????

lizmei001 2002-07-12 08:50:02
char *p;
{
char a[]="kkkk";
p = a;
}
cout<<"p is:"<<p<<endl;//一样的能打印出P的值???????
还有就是
char * f(){
char a[]="kkkk";
return a;
}
int main(){
char *p = f();
cout<<p<<endl;//也一样的能打印出P来,A在f()结束后应该没有了才对????
}
...全文
27 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_feng_fly 2002-07-12
  • 打赏
  • 举报
回复
char a[]="kkkk";这样写等同于char a[5]="kkkk";只是下标被忽略了,在c /c++语法里面数组定义就初始化的时候第一维的下标是可以省略的,因为编译器可以计算机出他们。
回到问题上来,你的程序显示出正确的结果,这只是因为那段内存还没有被再次使用而已。而且,在我的机器上就不能正确显示。我是Win2k+vc6.0
color918 2002-07-12
  • 打赏
  • 举报
回复
char a[]="kkkk";
并不是在栈上分配的内存,数组首地址是常量,把一个字符窜常量地址初始化
给了它,而字符窜常量是在全局数据区分配的内存。
所以函数返回的是一个在堆上的指针了,没有任何非法的!!!
elvahuang 2002-07-12
  • 打赏
  • 举报
回复
char *p;
{
char a[]="kkkk";
p = a;
}


char * f(){
char a[]="kkkk";
return a;
}
就那第二个例子来说:char a[]="kkkk";在堆栈上分配8个bytes来放"kkkk"用a来标识.(伴随的是堆栈指针的向上移动),然后返回a的首地址,sp开始向下移那么p拿到那个返回的首地址(只是sp的移动,没有别的,同意楼上说的)
elvahuang 2002-07-12
  • 打赏
  • 举报
回复
gz
Tommy 2002-07-12
  • 打赏
  • 举报
回复
退出函数时是不会有人帮你清除堆栈中的值的,所以堆栈中还会有那个字符串。不过说不定什么时候就给覆盖了,就没有了。
因为很多时候临时指针指向的内容还没有被覆盖,所以这种错误是很难找的,说不定在调试版没有问题,正式版就通不过了,也说不定一直都运行得很正常,直到有一天因为这个问题非法操作,这时候再想找出根源就难了。
kisscpp 2002-07-12
  • 打赏
  • 举报
回复
在栈上创建的变量,当她的离开它的作用域而生命结束时,系统要做的只是
把栈指针向下移sizeof(她的类型)的大小,而这时只要没有给其他变量分配
内存,她的内容还保留在内存中,所以你还可以得到它的内容,但这种操作
一般是没有意义的。

呵呵,美人烟消云散,但容颜依旧留在我们的记忆中!
alidiedie 2002-07-12
  • 打赏
  • 举报
回复
地址仍然存在,引用内容是非法的.
fminhua 2002-07-12
  • 打赏
  • 举报
回复
对,cccc2002(cccc) 说得对。
char *f()
{
char *a = "kkkk";
return a;
}
的话就是创建在静态区的。返回栈内存是禁止的。
cccc2002 2002-07-12
  • 打赏
  • 举报
回复
char * f(){
char a[]="kkkk";
return a;
}


返回的是指向临时char数组的首地址,如果这块内存尚未被覆盖是可以显示出来
的,不过这种行为是被严厉禁止的。
fminhua 2002-07-12
  • 打赏
  • 举报
回复
char * f(){
char a[]="kkkk";
return a;
}
此时a的类型已经是char *型了。char *型是创建在静态区的。只有程序退出时才会销毁。
zhou_hn 2002-07-12
  • 打赏
  • 举报
回复
char *p;
{
char a[]="kkkk";
p = a;
}
cout<<"p is:"<<p<<endl;//一样的能打印出P的值???????
还有就是
char * f(){
char a[]="kkkk";
return a;
}
int main(){
char *p = f();
cout<<p<<endl;//也一样的能打印出P来,A在f()结束后应该没有了才对????
}

局部函数变量保存在堆栈中,栈中的内容很容易被覆盖。它严禁返回指针和数组。
zhou_hn 2002-07-12
  • 打赏
  • 举报
回复
char *p;
{
char a[]="kkkk";
p = a;
}
cout<<"p is:"<<p<<endl;//一样的能打印出P的值???????
还有就是
char * f(){
char a[]="kkkk";
return a;
}
int main(){
char *p = f();
cout<<p<<endl;//也一样的能打印出P来,A在f()结束后应该没有了才对????
}

局部函数变量保存在堆栈中,栈中的内容很容易被覆盖。它严禁返回指针和数组。
lizmei001 2002-07-12
  • 打赏
  • 举报
回复
我终于明白了,现在结帐给分,可惜 我刚开始的分给得太小了点
denghby 2002-07-12
  • 打赏
  • 举报
回复
这个帖子不错~~~~~~~
LeeMaRS 2002-07-12
  • 打赏
  • 举报
回复
这么写就是对的.你返回的是i的值而非i的地址.
如果你是以下代码:(代码是临时写的,可能有不对的地方)
int * f()
{
int i=0;
return &i;
}
那就会出错.
hellwolf 2002-07-12
  • 打赏
  • 举报
回复
上面的是对的
那时会变成值拷贝,只要不用指针或引用,甚至是一个结构都会是值拷贝的
例如:
struct sa{.....}

sa f(){
sa a;
return a;
}
同样是对的
lizmei001 2002-07-12
  • 打赏
  • 举报
回复
对,但我也在是WIN2K下用VC,没有出现错误,我很奇怪,我是在测试别人的程序时看到的,所以提出来看看
还在我们经常这么用,那么也不对了
int f()
{
int i=0;
return i;
}
但这样用的人却很多
kisscpp 2002-07-12
  • 打赏
  • 举报
回复
to color918(新新人) :
i在栈上&&j在栈上分配=〉a在栈上分配
对吗??
main()
{
int i=0;
char a[]="kkkk";
int j=0;
printf("&i=%p\n",&i);
printf("&a=%p\n",a);
printf("&a=%p\n",&a[0]);
printf("&a=%p\n",&a[1]);
printf("&a=%p\n",&a[2]);
printf("&a=%p\n",&a[3]);
printf("&j=%p\n",&j);

}
LeeMaRS 2002-07-12
  • 打赏
  • 举报
回复
char a[]="kkkk"到底是什么意思?
是声明一个字符数组,把"kkkk"赋给它
a最后是一个[5]的数组,里面是{'k','k','k','k','\0'}

"kkkk"是在数组的内存块中,而不是在全局变量区.

返回数组a的首地址后,函数结束,a所占的内存块被释放,但内容还在,所以输出p所指向的内容,有时还是对的,但是属于非法操作.

在对内存管理较松的DOS/98下,用TC2/TC++3的人,往往能得到看似正确的结果.但换到内存管理较严的NT内核的2K/XP下,用VC就会报非法.

个人看法的说.怕了,有人说我星星多,说错话教错人,误人子弟.
LeeMaRS 2002-07-12
  • 打赏
  • 举报
回复
同意liu_feng_fly(谁动了我的~~~~~~~~工资)的说法,不要把在函数中创建的局部变量的指针带回来.
加载更多回复(2)

69,382

社区成员

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

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