2014-01-13 2 views
0

C++/C에서 당신은이 작업을 수행 할 수 있습니다이 LLVM-IR에 가능했던 경우 궁금 해서요, 또는 즉시 유형의 문제로 불평 것LLVM-IR 배열 포인터 할당

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. 

. 이것에 대해 잠수하려고했지만,이 특별한 예를 시도해 본 사람이 있는지 알았을 것이라고 생각했습니다. 나는 GEP A가 i8 *으로 0 번째 위치를, B와 C가 i32 *로 나타납니다. 이 모든 것이 가능하다면 나는 어떻게 진행해야하는지 조금 혼란 스럽다.

미리 감사드립니다.

UPDATE :

좋아, 대신 * B와위한 초기화를 추가 한 경우 C [0], C [1], 그것을하고자 LLVM-IR은/C/C에 대한 응답 변화 ++?

+0

예, 수정되었습니다. 감사. – redratio1

+1

'* B'와'C [0]'과'C [1]'을 초기화하지 않는다고 가정하면, 이것은 모두'B '에 의해 지시 된'unsigned int' (또는'int')를 취합니다. 'C'를'char' 크기로 자르고'A' 배열의 슬롯에 할당합니다. 모든 경고를 무시하지 않는다고 가정 할 때 정밀도 상실에 대한 경고를 받아야합니다. 그러나 정수 유형 간의 표준 변환으로 인해 이것은 다소 의문의 여지가 있지만 합법입니다. – twalberg

+0

@twalberg; 고마워, 그게 말이야/나는 연속적인 기억이 있었기 때문에 더 큰 타입을 배열에 넣을 수 있다고 생각했다. A의 배분을 통해 비트가 확장되도록하십시오. – redratio1

답변

0

LLVM은 특정 유형의 포인터를 다른 유형의 포인터 (예 : i32* ~ i8*)로 변환하는 데 자주 사용되는 bitcast 명령어를 가지고 있습니다. 당신이 다음을 수행, 4 바이트 번호의 3 번째 바이트에 액세스하려면

그래서 예를 들어, 완벽하게 합법적이다 : 당신이 그런 식으로 물건을 할 때

%bytes = bitcast i32* %num to i8* 
%third_byte = getelementptr i8* %bytes, i32 2 

그냥 마음에 엔디안을 유지한다.

예,이 기술을 사용하여 배열의 특정 위치에 대한 포인터를 얻고 거기에서 storeload 값을 얻을 수 있으므로 전체 예제를 복제 할 수 있습니다.

2

아니요. C/C++에서도 가능하지 않습니다. 초기화되지 않은 변수는 다른 변수에 할당하면 안됩니다. 정의되지 않은 동작을 호출합니다. *B*c은 초기화되지 않습니다.

+1

* "할 수 없습니다"* 매우 제한적인 언어라고 생각합니다. 할 수는 있지만 정의되지 않은 동작입니다. – Manu343726

+0

@ Manu343726; 동의했다. 그것을 바꿨다. – haccks

+0

그러나 B와 C가 초기화되면 잘 정의 된 동작을 수행 할 수 있습니까? 이 경우 @ redratio1 – redratio1