[问题] 关于C语言指标传址的问题

楼主: defsrisars (阿转)   2014-11-21 15:30:50
C
问题(Question):
小的最近初学C语言
在写程式时遇到了十分不理解的地方
希望有大大可以为小的指点迷津 谢谢
http://ideone.com/zAvKns
我觉得我在做和这个网页的程式码一样的事
我希望我能在函式Y改变函式X传入的struct内data的值
而这个程式码显示的结果也的确是传入的task.t与task->t
内存位址相同&&值也成功的被改变了
http://ideone.com/Uul86Q
这是小的现在在写的程式(未完成)
问题: 我在第265行的函式Display中宣告了Struct Player A
并在第331行将&A传入函式Getcard (Getcard的接收型态为 Player *A)
但是问题来了
我这样子的传入1. 传入后的 printf %p A->Case 与 传入前的 printf %p &A.Case
内存位址不同 && 我在Getcard改变A->Case为1 但是在Display A.Case仍为0
想请问为什么呢 ?
我以为我是在做和第一个网址的程式码一样的传址法
但是当我实际在我想写的程式里使用时 传入的址却与原本的址不同&&无法直接对地址
里的储存值做改变(我希望在Getcard值的改变也会直接改变在Display的值)
http://tinyurl.com/lsb7yg6
此外还有一个小小的问题是我在程式码第14-24行的宣告方式
(我要printf出牌组) 本来K后面是没有" "的
我知道我的阵列宣告也只有13个(虽然现在compiler没问题)
不知道为什么
我的最后一张牌梅花K会printf不出来(printf出来K的地方会变成
我在很远的地方的printf"Shuttle" 的Shuttle!)
感觉完全风马牛不相关(刚刚测试不管有没有多那个" " 都一样)
(意思是原本printf应该是 梅花 K 却变成 梅花 Shuttle!
请问为什么会这样呢?)
http://tinyurl.com/l449ogc
http://tinyurl.com/k354rxv
附图说明~(只有最后一张梅花K会有图1的结果 其他牌都正常)
谢谢大家~
初学者首po 如果有违反版规什么的请告知...谢谢
作者: allyusd (梦幻贱狗)   2014-11-21 16:43:00
我整理了程式码,http://ideone.com/YEKS60可以直接在 ideone 执行,但是没有解决你任何问题传址看起来是正确的,K 后面多余的删除了。也许你需要提供一下 开发平台(Platform) 相关资讯?我说的整理实际是把多余的 code 注解掉啦 XD我用 VS 2013 测试,没用过 Dev,请其它人帮忙看看吧没有耶,我测试的结果一切正常,所以没办法帮你对了,我有对 scanf 做了修改,不知道有没有影响
作者: carylorrk (carylorrk)   2014-11-21 18:58:00
的确有可能是 Compiler 太旧的问题~
作者: KoenigseggG (地表最速)   2014-11-22 00:15:00
Orwell Dev-C++?
作者: LPH66 (-6.2598534e+18f)   2014-11-22 09:31:00
我仔细看了一下, 你在 Getcard 里读输入的方法很危险temp 只有一个字符的大小, 你却读一个 %s 进去这代表一定有什么东西被读进来的"字串"的结尾'\0'给吃掉了你要不要改用 %c 或是把 temp 改宣告成字串试试看?(虽然这跟你原来的问题似乎无关就是了)嗯, 这边就是被那个'\0'盖掉的就是你那个阵列至于传址的部份我稍微看了一下应该是没什么问题或者该说这种做法在 C 里很普遍所以会有问题我也觉得很怪..>修文问题 确实是编译器对变量存放位置的关系除非你深入追下去不然不会知道编译器怎么排的所以最正确的做法就是不要超界
作者: n91324 (不丹)   2014-11-22 16:18:00
去抓mingw 用GNU最新的编译器
作者: KoenigseggG (地表最速)   2014-11-22 21:16:00
dev很旧,但Orwell dev应该很新吧0.0前几天才出最新版而已嗯嗯 加油XD

Links booklink

Contact Us: admin [ a t ] ucptt.com