[问题] void*与void**差异?

楼主: soheadsome (师大狗鼻哥)   2017-08-28 23:05:58
开发平台(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
作者: CoNsTaR ((const *))   2017-08-28 23:57:00
那你知道 void 和 void* 的差异吗?* 的意义是什么?
作者: james732 (好人超)   2017-08-29 00:02:00
你为什么会觉得void*跟void**是一样的东西...?
作者: alan23273850   2017-08-29 00:35:00
不过他在预期结果那里(void**)后面有一个&耶
作者: Lipraxde (Lipraxde)   2017-08-29 07:25:00
**指到*的位置,你虽然去了*的位置,但是没把*存起来。试试看存起来再取&抱歉我眼残的很严重我知道了啦,你把g_test_struct用传值的方式丢到load_table_from_shm_voidp里面。gey_shm里面虽然有对g_test_struct做修改,可是你的table没有被改到
楼主: soheadsome (师大狗鼻哥)   2017-08-29 08:37:00
可是我get shm的时候 是直接用全域变量
作者: Lipraxde (Lipraxde)   2017-08-29 08:47:00
你用全域变量没错,改的是全域的g_test_struct,但是区域的table没改到

Links booklink

Contact Us: admin [ a t ] ucptt.com