Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将8位指针强制转换为长 我试图在C++项目中使用第三方C库,我在Windows 64位上使用VisualStudio开发了它。 32位和64位编译成功;但是,在64位运行时,我在外部库中发现了一个问题,原因如下: double* foo(){ double* b; long a; long i; /* ... do some stuff to assign values to b, a, i ... */ return ( (long)b + a + i ); }_C_Pointers_32bit 64bit - Fatal编程技术网

将8位指针强制转换为长 我试图在C++项目中使用第三方C库,我在Windows 64位上使用VisualStudio开发了它。 32位和64位编译成功;但是,在64位运行时,我在外部库中发现了一个问题,原因如下: double* foo(){ double* b; long a; long i; /* ... do some stuff to assign values to b, a, i ... */ return ( (long)b + a + i ); }

将8位指针强制转换为长 我试图在C++项目中使用第三方C库,我在Windows 64位上使用VisualStudio开发了它。 32位和64位编译成功;但是,在64位运行时,我在外部库中发现了一个问题,原因如下: double* foo(){ double* b; long a; long i; /* ... do some stuff to assign values to b, a, i ... */ return ( (long)b + a + i ); },c,pointers,32bit-64bit,C,Pointers,32bit 64bit,问题是(至少在windows上)在x86体系结构中double*由4个字节表示,在x64中由8个字节表示,因此在return语句中强制转换b是错误的 我的问题是,有没有一种方法可以从8位表示中“提取”指针b的4字节地址,从而使表达式(b+a)有意义 谢谢大概是为了避免在sizeof(double)的倍数上进行指针算术运算 您可以对char*指针执行相同的操作,完全避免了大小问题。我还添加了代码缺失的原始指针类型的强制转换 return (double *)( (char *)b + a + i

问题是(至少在windows上)在x86体系结构中double*由4个字节表示,在x64中由8个字节表示,因此在return语句中强制转换
b
是错误的

我的问题是,有没有一种方法可以从8位表示中“提取”指针
b
的4字节地址,从而使表达式
(b+a)
有意义


谢谢

大概是为了避免在
sizeof(double)
的倍数上进行指针算术运算

您可以对
char*
指针执行相同的操作,完全避免了大小问题。我还添加了代码缺失的原始指针类型的强制转换

return (double *)( (char *)b + a + i );
注意:您应该知道,您可以轻松创建未对齐的指针,如果取消引用,可能会导致未定义的行为。这也是您的原始代码的问题


小心;您的代码看起来很可疑,可能还有其他潜在的缺陷。

请了解位和字节之间的区别,这对于有效地交流想法至关重要。指针是四个或八个字节,而不是位。我可能会错过一些明显的东西,但从返回行中简单地删除(长)不会解决问题吗?所讨论的代码毫无意义。目前还不清楚它的设计目的是什么,所以很难说什么是合适的修复方法。如果是您的代码,我的建议是避免任何和所有强制转换。@n.m.我认为强制转换是使加法的行为如同a和I是字节数量,而不是双倍。问题可能是因为Windows 64上的
long
仅为32位,因此指针会被截断。如果这是第三方库代码,我会将其丢弃,或者至少重新编译,最大警告级别,所有警告都视为错误,然后手动分析每个警告,并思考如何消除它。中大奖!将(long)改为(char*)成功了。现在,x64版本的行为与x86版本完全相同。@gcaglion很高兴它工作正常。但就像我说的,指针算术让我有点紧张。出于好奇,你能告诉我这个库是什么吗?我自己从来没有使用过指针算法,但是,正如我所写的,我决定使用现有的第三方外部库来节省一些时间,我确实这样做了。顺便说一句,外部代码来自(特别是函数内核\u cache\u clean\u和\u malloc()在学习中。c@gcaglion它上一次更新是在2008年,当时恐龙还在地球上游荡。这个网站看起来像是1998年的。但是我出于好奇下载了这个库,在里面找不到这样的代码。里面肯定有很多虚假和可疑的类型转换。@n.m.可能是第3711行的代码。有趣的事也就是说,整数转换似乎毫无意义:有一个
sizeof(CFLOAT)
用于手动乘以指针增量。