作者soheadsome (师大狗鼻哥)
看板C_and_CPP
标题[问题] void*与void**差异?
时间Mon Aug 28 23:05:58 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc x64 4.8.3 或4.8.5
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
使用void** 与void*结果不一致
不晓得是compiler bug或是shared memory的address是否有地雷
喂入的资料(Input):
可以使用
python -c 'print("\x55\xAA\x55\xAA")' > struct.bin
产生测资 档名一定要struct.bin
预期的正确结果(Expected Output):
执行以下两行程式片段应该一样结果
以下是call两个不同函数
load_table_from_shm_voidpp((void**)&g_test_struct);
load_table_from_shm_voidp((void*)g_test_struct);
错误结果(Wrong Output):
load_table_from_shm_voidp((void*)g_test_struct);
执行到read会取得errno=14 bad address
用gdb看bt, 传入的void*会是(void*)0
程式码(Code):(请善用置底文网页, 记得排版)
gist
https://gist.github.com/swt02026/d6bafca53b375e62d807c33f33a0b694
补充说明(Supplement):
因为是公司的程式码
所以我修改成最小能重现相同状况的程式码
编译参数要加上 -std=gnu11
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.162.42.220
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1503932763.A.ECC.html
1F:推 CoNsTaR: 那你知道 void 和 void* 的差异吗?08/28 23:57
2F:→ CoNsTaR: * 的意义是什麽?08/28 23:57
3F:→ james732: 你为什麽会觉得void*跟void**是一样的东西...?08/29 00:02
4F:推 alan23273850: 不过他在预期结果那里(void**)後面有一个&耶08/29 00:35
5F:→ Lipraxde: **指到*的位置,你虽然去了*的位置,但是没把*存起来。08/29 07:25
6F:→ Lipraxde: 试试看存起来再取&08/29 07:25
function名称好像取的不是很好
推文好像都以为是同一个function....
※ 编辑: soheadsome (223.137.244.234), 08/29/2017 07:31:50
※ 编辑: soheadsome (223.137.244.234), 08/29/2017 07:33:19
7F:→ Lipraxde: 抱歉我眼残的很严重08/29 07:53
这是我的问题 大家都用手机 取太像会分不清
※ 编辑: soheadsome (223.137.244.234), 08/29/2017 08:01:29
8F:推 Lipraxde: 我知道了啦,你把g_test_struct用传值的方式丢到load_ta08/29 08:24
9F:→ Lipraxde: ble_from_shm_voidp里面。gey_shm里面虽然有对g_test_st08/29 08:24
10F:→ Lipraxde: ruct做修改,可是你的table没有被改到08/29 08:24
11F:→ soheadsome: 可是我get shm的时候 是直接用全域变数08/29 08:37
喔喔 我了解了
我传入的时候g_test_struct 还没指到shm
传入table就会是还没初始化的旧值
感谢<(_ _)>
※ 编辑: soheadsome (223.137.244.234), 08/29/2017 08:47:12
12F:→ Lipraxde: 你用全域变数没错,改的是全域的g_test_struct,但是区 08/29 08:47
13F:→ Lipraxde: 域的table没改到 08/29 08:47