诡异的C语言问题
c吧
全部回复
仅看楼主
level 10
mhpmii 楼主
程序如图,获取路径名和文件名的两个函数
把注释去掉就能正常运行
注释之后时灵时不灵,乱码什么的
大神快来破
2016年03月16日 12点03分 1
level 10
mhpmii 楼主
神奇吧
2016年03月16日 12点03分 2
level 10
mhpmii 楼主
注释之后的效果
打开注释的效果
2016年03月16日 12点03分 4
level 9
我没用过dirname和basename这俩函数,但可以猜测这俩函数的实现跟strtok类似。将m_path声明为static可破。
2016年03月16日 15点03分 5
是可以,谢谢[笑眼]
2016年03月17日 08点03分
@mhpmii 不过我好奇的是 printf 在这里起了什么神奇的功效
2016年03月17日 08点03分
我奇怪的是pritntf在这里起了什么作用,只要用printf打印一遍,返回就正常了
2016年03月17日 08点03分
@mhpmii 我上贴吧比较少,回复慢了。楼下那位同学说得对,变量生存周期的问题,或者说栈的问题。可以了解下c语言中栈的相关知识。 你的问题是在函数返回后再去访问这个函数里栈的信息,这时候栈已被系统回收了,你的操作就会有不可预知的结果,很危险。
2016年03月18日 16点03分
level 6
注意变量的生存期。另外要动脑,别碰到问题就说c语言诡异。
2016年03月17日 01点03分 6
这和生存期有什么关系,打开printf语句的注释,返回结果就正确了,我只是不理解这其中的原因,你解释一下[吐舌]
2016年03月17日 08点03分
我奇怪的就是 printf 语句在这里起了什么神奇的功效
2016年03月17日 08点03分
@mhpmii 直接定义字符串和malloc,new效果一样?
2016年03月17日 16点03分
level 6
调用了 printf 导致栈被修改,正好在变量结尾添加了 \0,还可能有其它不可见字符,表现为正常。实际上这样写是不对的,自己找变量生存期的资料。
2016年03月18日 06点03分 8
实际上我试过手动加/0而不是调用printf,而且printf会在结尾加/0这种说法是从哪里来的,这个问题不讨论了,只能说发生了不可预期的事情
2016年04月17日 09点04分
level 1
不懂这个意思,怎么理解。库函数运用的代码:http://www.manonggu.com/biancheng/183
2016年04月21日 02点04分 9
level 7
你return回来一个函数内局部变量,函数在结束调用后栈里的东西就被释放了,这块内存被标记为空闲,很有可能被其他地方使用,所以你打印出任何值都有可能,你这个注释前后的差异只是刚好巧合而已
2016年04月22日 01点04分 10
兄弟 不要误人子弟 你这说法有问题啊 return会把返回值 放到寄存器中 如果是值传递是绝对没问题的 哈哈
2016年04月26日 04点04分
我插 原来他代码是传的地址
2016年04月26日 04点04分
level 7
换句话说,你的m_path变量在退出函数时就已经被释放了,他什么时候再被分配给别人使用只有系统知道,在这之前那里的值还不变,但是你使用了printf,可能恰好占用到了原来m_path变量的部分内存,所以你再打印结果就不一样了,极端一点,如果你的计算机时刻保持内存几乎全被吃满的状态,你的这个程序不管注释不注释,都不可能打印出
正确的
文件路径和名称
2016年04月22日 01点04分 11
level 7
楼上说的变量生命周期是正解,这是基本知识,你之所以纠结就是没弄清楚这个问题
2016年04月22日 01点04分 12
level 10
难难难,老哥现在还搞c么[真棒]
2022年12月02日 13点12分 13
1