2014-09-02 2 views
-5

함수에 문자열을 전달하고 UINT32에 할당해야합니다.char 포인터를 UINT32로 캐스팅하십시오.

void main() 
{ 
    do_this ("SELF", 18, 100); 
} 

void do_this(char* comm , UINT32 num , UINT32 value) 
{ 
    UINT32 inl_values[13] ; 

    inl_values[0] = (UINT32)comm ; 
} 

문자열을 inl_values에 할당하려고했습니다. 하지만 오류가 발생합니다 : 할당 캐스팅없이 포인터에서 정수를 만듭니다.

이 값을 UINT32에 묶고 inl_values ​​완료 배열을 다른 함수로 전달해야합니다. 누군가 내가 어떻게 해결할 수 있는지 말해 줄 수 있습니까?

+1

우리는이 "다른 기능"의 정의를 볼 수 당신에게 inl_values''전달하려는? 'inl_values'는 숫자 배열입니다. 그것에 문자열을 할당하는 것은 말이되지 않습니다. – cdhowie

+0

포인터 (메모리 주소)를 정수로 변환하려고합니다. 나는 당신이 원하는 것이 그 주소의 ** 내용 **을 정수로 얻는다고 생각한다. – m0skit0

+0

'inl_values ​​[0] = * ((UINT32 *) (& comm));가 작동해야합니다. 그러나 당신이 정말로 좋은 이유가 없다면이 일을하지 마십시오. (나는 네가 그렇게 생각하지 않는 경향이있다.) –

답변

0

코드에서 첫 번째 매개 변수로 32 비트 연산 코드가있는 API를 호출하고 API 작성자가 opcode를 선택하여 결합 된 16 진수/ASCII 덤프를 수행 한 경우 어레이의 "SELF"ASCII 문자를 볼 것입니다. 이 방법의 예를 들어 nginx를 구성 코드를 참조하십시오 https://github.com/nginx/nginx/blob/master/src/core/ngx_conf_file.h

#define NGX_CORE_MODULE  0x45524F43 /* "CORE" */ 

문자열 "CORE는"참조 주석에 있지만, 코드가 결코 실제 문자열을 사용하지 않습니다. 심볼은 부호없는 32 비트 정수이며 int가 필요한 모든 위치에서 사용할 수 있습니다. 그러나 int의 4 바이트 (리틀 엔디안 읽기)는 0x43 ('C'), 0x4F ('O'), 0x52 ('R') 및 0x45 ('E)입니다.

같은 접근법 - ASCII 문자열 "SELF"를 작성하는 대신 정수로 변환하는 수학을 수행하여 컴파일러가 작업하게하십시오. 이 새로운 상수를 사용

#define SELF_CODE 0x464C4553 /* "SELF" */ 

, 모든 문자열을 사용하지 않도록 코드를 재 작성 :

void main() 
{ 
    do_this (SELF_CODE, 18, 100); 
} 

void do_this(UINT32 comm , UINT32 num , UINT32 value) 
{ 
    UINT32 inl_values[13] ; 

    inl_values[0] = comm ; 
} 
관련 문제