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