在C ++ / C中,你可以这样做:
unsigned char A[12];
unsigned int *B;
int *C;
B = malloc(sizeof(unsigned int));
C = malloc(2*sizeof(int));
A[0] = *B;
A[4] = *C;
//Then go on to access A byte by byte.
我想知道这在LLVM-IR中是否可行,或者它会立即抱怨类型有问题。即将潜入这个,但我想我会看到是否有人尝试过这个特殊的例子。我会将A的第0个位置作为i8 *,然后将B和C作为i32 *。如果可能的话,我有点困惑如何继续。
提前致谢。
更新:
好的,如果我改为为* B和C [0],C [1]添加初始化,那么LLVM-IR / C / C ++的答案是否会改变?
答案 0 :(得分:2)
没有。这在C / C ++中也是不可能的。您不应将未初始化的变量分配给另一个变量。它调用未定义的行为。 <{1}}和*B
未初始化。
答案 1 :(得分:0)
LLVM具有bitcast
指令,该指令通常用于将一种类型的指针转换为另一种指针类型 - 例如i32*
到i8*
。
因此,例如,如果要访问4字节数字的第3个字节,执行以下操作是完全合法的:
%bytes = bitcast i32* %num to i8*
%third_byte = getelementptr i8* %bytes, i32 2
当你做那样的事情时,请记住结束。
是的,您可以使用此技术获取指向数组中特定位置的指针,并从那里获取store
和load
值,这样您就可以复制整个示例。