是否有一个指向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;
答案 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*
;如果没有,它会在取消引用时崩溃。
这只是演员阵容出错的一个例子。你正在做什么(乍一看)看起来会起作用,但总的来说,当你施展东西时你真的需要注意。