【发布时间】:2020-01-13 16:28:35
【问题描述】:
我的问题是需要通过void * 函数参数正确传递double 变量。我问是因为在我的机器上sizeof(void *) 是4,而sizeof(double) 是8,将一个转换为另一个似乎应该会导致问题,但是我的编译器(CLANG,所有警告都打开。)给出没有任何问题的迹象,并且代码似乎工作正常。
请注意,我见过this 和this。他们的标题中有相似的组成词,但不回答这个具体问题。
以下是否会导致严格的别名违规错误?或未定义的行为?
// some calling function
double a = 0.000234423;
func1(&a);
...
void func1(void *var)
{
double a = *(double *)(var);
}
【问题讨论】:
-
您的 4 字节指针指向一个 8 字节对象。有什么问题?
-
你的问题说你想在指针的值中存储一个双精度值,但是你的代码说你想在你的指针中存储一个指向双精度值的指针。哪一个?只有一个有意义,但你仍然应该具体。
-
@MadPhysicist:我看不到任何地方字面上说要存储双 值。问题是你如何传递一个双变量,基本答案归结为“按引用传递”,因为“按值传递”不起作用。
-
只要你不做肮脏的hack就可以了,即将一个值转换为一个指针,然后让回调函数从指针转换回整数。显然,这是各种 thrashy pthread 应用程序中的常见 hack(因为他们担心如果通过 ref 传递原始值会超出范围)。
-
sizeof(void *) is 4那么?如果void *以char *开头并指向一个 124,513 字节的char数组呢?
标签: c strict-aliasing