社区
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()结束后应该没有了才对????
}
...全文
60
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)
程序的
内存
分配
之堆和
栈
的区别
本文深入探讨了程序中
内存
分配
的
栈
和堆的区别,包括它们的管理方式、空间大小、碎片产生、生长方向、
分配
方式、缓存级别和
分配
效率。
栈
由编译器自动管理,适合存放函数参数和局部变量,而堆由程序员控制,适用于需要动态
分配
大块
内存
的情况。堆可能产生
内存
碎片,
分配
效率低于
栈
。Java中的堆和
栈
虽然由JVM自动管理,但也存在类似的区别。了解这些概念有助于优化程序性能和避免
内存
问题。
C++ 在
栈
上
分配
内存
本文深入探讨C语言中的
内存
分配
方式,包括静态存储区域、
栈
和堆的特性。详细对比malloc与calloc、realloc的功能与使用场景,解析
内存
初始化、
内存
泄漏等问题,以及realloc操作的细节与注意事项。
栈
上
分配
内存
函数Alloca
Alloca函数常被误认为是堆上
内存
分配
,实际上它是在
栈
上
分配
内存
。不同于calloc和malloc,alloca
分配
的
内存
无需手动释放,超出作用域即回收。然而,由于
栈
空间限制和潜在的安全问题,alloca不推荐用于大容量数据结构的
分配
,可能导致
栈
溢出和其他
内存
破坏。最佳实践是遵循编译器默认的
栈
内存
管理。
C语言函数
内存
分配
机制及函数
栈
帧详解
本文深入探讨了C语言中函数
内存
分配
的细节,包括函数地址
分配
、
栈
帧的形成与共享。通过示例代码展示了参数和局部变量的
内存
布局,强调了
栈
帧中地址的稳定性以及返回
栈
帧变量指针的风险。理解这些概念有助于避免编程错误,特别是涉及指针和
内存
管理时。
堆和
栈
的
内存
分配
本文详细比较了
栈
(stack)与堆(heap)在
内存
分配
、规则、成本、速度和安全性的不同。
栈
用于静态
分配
,
内存
自动管理,而堆则供动态
分配
,程序员需手动释放,涉及
内存
泄漏风险。了解这些特性有助于提高代码效率和避免
内存
问题。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章