函数中: case{}块里面局部变量buff的地址,在块外面还能访问吗?

tongjing524 2014-12-26 02:00:32
举个简单的例子:
int cmd = 0;
char *pSendBuf = NULL;
switch(u32CmdType)
{
case 0:
{
char buff[32] = {0};
strcpy(buff, "some date");
pSendBuf = (char *)buff;
}
break;
}
printf("pSendBuf = %s\n", pSendBuf);

打印:some date


case{}块里面的局部变量buff地址,在块外面还能这样访问吗?
...全文
171 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-12-28
  • 打赏
  • 举报
回复
引用 14 楼 tongjing524 的回复:
感谢大家的解惑,尤其是
引用
zhao4zhong1
tongjing524 2014-12-27
  • 打赏
  • 举报
回复
感谢大家的解惑,尤其是
引用
zhao4zhong1
赵4老师 2014-12-26
  • 打赏
  • 举报
回复
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时,会自动执行其析构函数,……
一根烂笔头 2014-12-26
  • 打赏
  • 举报
回复
在C中,标准里面提到4种作用域: function, file, block, and function prototype. 你说问题的属于其中的block作用域问题! 处在作用域外不能访问作用域内的变量,可以访问同一作用域的变量!函数中的{ } 开启一个新的块作用域!遇到 ‘{‘就标示一个新的作用域开始,’}‘标示一个作用域的结束!因此,是不能访问!
  • 打赏
  • 举报
回复
引用 9 楼 luoxuechengbing 的回复:
[quote=引用 5 楼 tongjing524 的回复:] [quote=引用 2 楼 FightForProgrammer 的回复:] 不能鸟~花括号以内
函数结束前,buff所占用内存不会被系统收回,还在栈里面的地址不能访问吗[/quote] 基础差。。。 [/quote] 和我一样
赵4老师 2014-12-26
  • 打赏
  • 举报
回复
用API ReadProcessMemory还能访问正运行的其它进程的内存里面的每个字节呢!
  • 打赏
  • 举报
回复
引用 5 楼 tongjing524 的回复:
[quote=引用 2 楼 FightForProgrammer 的回复:] 不能鸟~花括号以内
函数结束前,buff所占用内存不会被系统收回,还在栈里面的地址不能访问吗[/quote] 基础差。。。
赵4老师 2014-12-26
  • 打赏
  • 举报
回复
绝对能访问,只不过没人保证这个地址开始的若干字节的值保持不变或如你所愿。
赵4老师 2014-12-26
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
盛夏 2014-12-26
  • 打赏
  • 举报
回复
感觉不能用,未测试。 这么用说不定会出现什么效果,感觉这么写就是在挑战系统的忍耐度
tongjing524 2014-12-26
  • 打赏
  • 举报
回复
引用 2 楼 FightForProgrammer 的回复:
不能鸟~花括号以内
函数结束前,buff所占用内存不会被系统收回,还在栈里面的地址不能访问吗
aime999 2014-12-26
  • 打赏
  • 举报
回复
这个涉及到两个名词:作用域和生存期 作用域就是变量所在的{}内,而生存期是和栈关联的,在函数main的栈的生存期内buff的指针和指向的数据是一直存在的,因此在外面通过pSendBuf是可以访问的,但是buff就不能被访问了(编译都会报错)
tongjing524 2014-12-26
  • 打赏
  • 举报
回复
引用 1 楼 pengzhixi 的回复:
不能访问,作用域的范围就在{}
但是 buff是在函数开始的时候入栈,在函数结束出栈,{}结束后buff还在栈里面,并未被系统收回, 这样来看的话,访问这个地址应该是可以的
FightForProgrammer 2014-12-26
  • 打赏
  • 举报
回复
不能鸟~花括号以内
pengzhixi 2014-12-26
  • 打赏
  • 举报
回复
不能访问,作用域的范围就在{}

69,382

社区成员

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

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