转换/解除引用指向双数组的char指针

时间:2013-10-06 22:52:14

标签: c++ pointers

是否有一个指向char指针的双指针有什么问题?以下代码中的目标是以三种不同的方式更改1元素。

double   vec1[100];
double   *vp = vec1;
char     *yp = (char*) vp;
vp++;
vec1[1] = 19.0;
*vp = 12.0;
*((double*) (yp + (1*sizeof (vec1[0])))) = 34.0;

2 个答案:

答案 0 :(得分:0)

对于较新的INTEL处理器,您可能遇到的主要问题是对齐。假设你要写这样的东西:

*((double*) (yp + 4)) = 34.0;

然后您可能会遇到运行时错误,因为double应该在8个字节上对齐。在诸如68k或MIPS等处理器上也是如此。

这类似于在该结构上具有结构并进行强制转换。你不可能破坏事物。

在大多数情况下,如果你可以避免这种情况,那么你的代码会更强大。就个人而言,我在阅读文件时甚至不使用这些演员表。相反,我从文件中获取数据并根据需要将其放入结构中。假设我在缓冲区中读取4个字节以转换为整数,我会这样写:

unsigned char buf[4];
...
fread(buf, 1, 4, f);
my_struct.integer = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);

现在我没有做一个丑陋的演员,我可以控制文件中整数的endianess,无论你运行的处理器的endian是什么。

答案 1 :(得分:0)

这种类型的演员属于“如果你知道你在做什么就行,但如果你不知道那就很危险”。

例如,在这种情况下,您已经知道“yp”的指针值(它指向double)因此在技术上可以安全地将其值增加double的大小并重新投回double*

一个反例:假设你没有知道char*来自哪里......比如,它是作为函数参数提供给你的。现在,你的演员阵容将是一个大问题:因为char*在技术上是1字节对齐而double通常是8字节对齐的,所以你无法确定你是否获得了8字节对齐的地址。如果它已对齐,则算术将生成有效的double*;如果没有,它会在取消引用时崩溃。

这只是演员阵容出错的一个例子。你正在做什么(乍一看)看起来会起作用,但总的来说,当你施展东西时你真的需要注意。