В 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, или он сразу же будет жаловаться на проблему с типами. Собирался погрузиться в это, но подумал, посмотрю, попробует ли кто-нибудь этот конкретный пример. Могу ли я получить 0-е местоположение A как i8 *, а затем B и C как i32 *. Я немного запутался, что делать дальше, если это вообще возможно.
Спасибо заранее
ОБНОВИТЬ:
Хорошо, если бы я вместо этого добавил инициализацию для * B и C [0], C [1], изменится ли ответ для LLVM-IR / C / C ++?
LLVM имеет bitcast
инструкция, которая часто используется для преобразования одного типа указателя в другой тип указателя — например, i32*
в i8*
,
Так, например, если вы хотите получить доступ к 3-му байту 4-байтового числа, выполнение следующих действий совершенно законно:
%bytes = bitcast i32* %num to i8*
%third_byte = getelementptr i8* %bytes, i32 2
Просто имейте в виду, что вы делаете что-то подобное.
И да, вы можете использовать эту технику для получения указателей на определенные места в массиве и store
а также load
значения оттуда, что позволяет вам дублировать весь ваш пример.
Нет. Это также невозможно в C / C ++. Не следует присваивать неинициализированную переменную другой переменной. Это вызывает неопределенное поведение. *B
а также *c
неинициализированы.