2014-02-25 4 views
0

합집합이 정의되고 정수 값이 지정됩니다. 필요한 배열 크기가 추정됩니다. 다음 값은 공용체에 정의됩니다. 그러나 바이트 배열 값을 인쇄 할 수 없습니다 (즉, 다음 코드의 마지막 부분은 인쇄되지 않습니다). 을 감안할 때 :int 값에서 바이트 배열 값을 추출 할 수 없습니다.

int i; 

int numberOfBytes = 1; 
int targetValue = 123456789; 
int sum = 0; 
sum = pow(16, numberOfBytes); 

while (sum < targetValue) { 
    //printf("Trying value: %d \n", (16^numberOfBytes)); 
    numberOfBytes++; 
    sum += pow(16, numberOfBytes); 
} 
numberOfBytes++; // add 1 more byte space 
printf("Number of Bytes: %d \n", numberOfBytes); 
printf("Sum: %d \n", sum); 


foo.byte = malloc(sizeof(unsigned char)*numberOfBytes); 

if (foo.byte == NULL) 
    printf("malloc fail\n"); 

// clear foo 
for (i=numberOfBytes; i >= 0;i--) { 
    foo.byte[i] = 0; 
} 

foo.integer = targetValue; 
printf("Trying value: %d \n", foo.integer); 

다음 인쇄되지 않은 주에서

union { 
    unsigned int integer; 
    //unsigned char byte[4]; 
    unsigned char* byte; 
} foo; 

() : 노동 조합에서

for (i=numberOfBytes; i >= 0;i--) { 
    printf("%x ", foo.byte[i]); 
} printf("\n"); 
+0

배열은 포인터와 다릅니다. 편집 : 조합에 바이트 배열이있는 경우 int는 처음 4 바이트를 겹칩니다. 공용체가 대신 포인터를 가지고있을 때, int는 포인터 자체가 겹쳐집니다. 포인터가 가리키는 처음 4 바이트가 아닙니다. – immibis

+0

노동 조합에서는 동일한 공간을 공유합니다. 수정 된 배열 크기를 설정하는 대신 어떻게 해결해야합니까? – Babbit

답변

2

을 foo.byte는 메모리 영역에 대한 포인터입니다.

foo.byte = malloc(sizeof(unsigned char)*numberOfBytes); 

은 동적으로 할당 한 메모리 영역에 대한 포인터로 설정합니다. 그런 다음이 :

foo.integer = targetValue; 

이 값 포인터를 덮어 쓰는 것입니다.

는이 :

for (i=numberOfBytes; i >= 0;i--) { 
    printf("%x ", foo.byte[i]); 
} printf("\n"); 

아마 당신에게 세그먼트 폴트를 줄 것 targetValue의 값을 참조를 해제하려고 할 것이다.

int로 targetValue를 선언 했으므로 항상 sizeof (int) 바이트 길이가됩니다. 동적으로 할당 할 이유가 없습니다.

당신은 당신의 구조체를 변경할 수 있습니다

union { 
    unsigned int integer; 
    unsigned char byte[sizeof(int)]; 
} foo; 

나는 당신이 일을하려고하는 것은 targetValue의 값을 인코딩, 정확히 그 크기의 조합을 만들 바이트의 최소 수를 알아낼 가정합니다.

노조에 대해 이해해야 할 또 다른 사항은 항상 가장 큰 구성원의 공간을 차지하므로 동적으로 유니언을 할당하더라도 적어도 sizeof (int)만큼 길게해야한다는 것입니다. int에 쓸 때마다 인접한 메모리가 손상됩니다.

아마 당신은하려고하는 것을 다시 생각하고 다른 각도에서 접근해야합니다.

관련 문제