안전

2017-11-15 3 views
2
내가 C에서 간단한 가상 머신을 개발하고

을 제기하는 내용 노조를 쓰고, 그리고, 스레드 코드를 사용하여이 구조를 고려할 것 :안전

struct opcode 
{ 
    int somefields; //etc 
    union z 
    { 
    char opcode; 
    void *opaddress; 
    } 
} 

내 질문에, 같은 쓰기 안전 및 휴대용 일 아닌가요됩니다 char 데이터 (opcode)로 구조체를 만들고 다른 컴퓨터 (그리고 아마도 다른 아키텍처)에 파일을로드하고 즉시 포인터 (opaddress)를 채우십시오.

+0

같은 액세스 할 수 있습니다 포인터. 'char'' opcode를 쓰고 읽는 것이 더 쉬울 것입니다. –

+0

음. 존재하지 않을 수도있는 패딩 표준이 없습니다. 따라서 하나의 머신에서'쓰기 '한다고해서 다른 컴파일러에서 구조체의 동등한'읽기'가 보장되는 것은 아닙니다. 바이트는 같을 것이지만, 같은'struct '에로드 될지 여부는? '(void *')를 고려하면 더 좋아집니다. 포인터는 다른 아키텍처에서 크기가 다를 수 있습니다. 포인터와'char'는 절대 같은 크기가 아닙니다. 나는 다른 고려 사항이있을 것이라고 확신한다. 또한 이와 비슷한 작업을 수행 할 수 있도록 직렬화 라이브러리가 있습니다. –

+0

친구, 파일에 쓸 때 나는 포인터 (쓸데없는 *)를 쓰지 않을 것입니다. 대신 파일에서 데이터를 읽을 때 char 값을 쓰고 어쩌면 그 포인터를 쓸 수 있습니다. char의 값에 따른 조합. –

답변

-1

데이터 유형은 아키텍처마다 다를 수 있으므로 동일한 크기를 보장 할 수 없습니다.

typedef struct 
{ 
    int somefields; //etc 
    union 
    { 
    char opcode; 
    void *opaddress; 
    }z; 
}opc; 

당신은 그래서 당신은 짧은있는 컴퓨터에서 너무 많은 바이트를 쓰기 때문에 단순히 실패 할 수 있습니다 그 모든 바이트를 복사, 노조의 크기는 다른 아키텍처에 다를 수도 있습니다

opc.somefields = 10; 
opc.z.opcode = 1; 
+1

나는 이것이 질문에 대답하지 않는다고 생각한다. – WedaPashi

+0

이 질문에 대한 답을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. - [리뷰에서] (리뷰/저품절 포스트/17948943) –