社区
C语言
帖子详情
关于在栈上分配的内存?????
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()结束后应该没有了才对????
}
...全文
33
22
打赏
收藏
关于在栈上分配的内存?????
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()结束后应该没有了才对???? }
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
如何让类对象只在
栈
(堆)上
分配
空间?
一般情况下,编写一个类,是可以在
栈
或者堆
分配
空间。但有些时候,你想编写一个只能在...1、静态建立类对象:是由编译器为对象在
栈
空间中
分配
内存
,是通过直接移动
栈
顶指针,挪出适当的空间,然后(编译器)在这片
内存
java创建对象时
分配
内存
方式,是堆上
分配
还是
栈
上
分配
?
创建对象的
内存
是
分配
在堆上还是
栈
上面?大部分童鞋的回答是这样的:“肯定
分配
在堆
内存
的嘛,
栈
内存
的那是java
栈
属于子线程专用的
内存
空间”
变量声明有没有
分配
内存
?
具体是在
栈
空间还是在堆空间里
分配
内存
呢? A1: int i; int *p; 这两个都在
栈
区
分配
了
内存
空间 但是p指向的地址为野地址,不可直接拿来使用 即p指向的空间没有
分配
Q2:在Java中定义数组时必须...
GoLang之
栈
的
内存
是怎么
分配
的?堆
内存
管理怎么
分配
的?
GoLang之
栈
的
内存
是怎么
分配
的?堆
内存
管理怎么
分配
的?
C语言定义了一个结构体怎么
分配
内存
?C\C++中结构体变量与结构体指针
内存
分配
问题?
C语言定义了一个结构体怎么
分配
内存
?C\C++中结构体变量与结构体指针
内存
分配
问题? 问题1:结构体指针最开始怎么
分配
内存
?用sizeof()是不能确定大小的。 问题2:给结构体变量
分配
之后,是否还要给每个成员
分配
,...
C语言
70,020
社区成员
243,264
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章