2017-04-14 9 views
1

int에 char을 할당하면이 문제가 발생합니다. 나는 consts * 데이터을 가지고 있는데, 이것들은 differents 객체의 크기의 저장소처럼 작동합니다. 데이터이 객체와 같은 크기를 갖고 있는지 확인하기 위해 이것을 사용하면 데이터에 정수를 추가합니다. 문제는 내가 2데이터, ASCII 표 2 개의 위치를 ​​이동하지만 어떻게 데이터를 문자열로 동작합니다을 추가 할 때, 나는이 또한 작동 방법을 이해 할 수없는 것으로 예상 있다는 것입니다.Int char에 추가, 예상대로 동작하지 않습니다.

예 : 나는 문자를 '' '저장 const를 숯불 * 데이터을 가지고, 내가 할 경우 즉, 96의 값이 :

data += 2; 

나는 결과가 을 것으로 예상 b이지만 <의 값은 60입니다.

나는 sys_log 함수를 사용하여 어떤 일이 발생하는지 보여줍니다.

기능 부팅 :

 void Boot(const char* data){ 
    [...] 
    /* 
    * OBJECT PROTO 
    */ 

    sys_log(0, "BOOT: OBJ PROTO data string: data = %s", data); 
    sys_log(0, "BOOT: OBJ PROTO size of data: %d", decode_2bytes(data)); 

    if (decode_2bytes(data) != sizeof(TObjectProto)) 
    { 
     sys_err("object proto table size error"); 
     thecore_shutdown(); 
     return; 
    } 
    sys_log(0, "BOOT: OBJ PROTO data after decode_2bytes(data): data = %s", data); 
    data += 2; 
    sys_log(0, "BOOT: OBJ PROTO data str + 2: data = %s", data); 

    size = decode_2bytes(data); 
    sys_log(0, "BOOT: OBJ PROTO data to size: size = %d", size); 

    data += 2; 
    sys_log(0, "BOOT: OBJ PROTO data str + 2: data = %s", data); 
    sys_log(0, "BOOT: OBJ PROTO data to size: size = %d", decode_2bytes(data)); 

    CManager::instance().LoadObjectProto((TObjectProto *) data, size); 

    sys_log(0, "To data assign %d * %d", size, sizeof(TObject)); 
    data += size * sizeof(TObjectProto); 
    sys_log(0, "BOOT: OBJ PROTO data str: data = %s", data); 

    [...] 

decode_2bytes() :

inline WORD decode_2bytes(const BYTE *a) 
{ 
    return (*((WORD *) a)); 
} 

sys_log :

Apr 12 09:05:54.205886 :: BOOT: OBJ PROTO data string: data = ` 
Apr 12 09:05:54.205914 :: BOOT: OBJ PROTO size of data: 96 
Apr 12 09:05:54.205924 :: BOOT: OBJ PROTO data after decode_2bytes(data): data = ` 
Apr 12 09:05:54.205933 :: BOOT: OBJ PROTO data str + 2: data = < 
Apr 12 09:05:54.205948 :: BOOT: OBJ PROTO data to size: size = 60 
Apr 12 09:05:54.205961 :: BOOT: OBJ PROTO data str + 2: data = ½6 
Apr 12 09:05:54.205970 :: BOOT: OBJ PROTO data to size: size = 14013 
Apr 12 09:05:54.209238 :: To data assign 60 * 40 
Apr 12 09:05:54.209247 :: BOOT: OBJ PROTO data str: data = (

바와 같이 sys_log에서 볼 수있는, 내가 데이터를 포함하는 것을 보여 값 , 2를 더하면 얻을 수있는 결과입니다.

+1

포인터에 2를 추가하고 참조 해제 된 값이 아닌 것 같습니다. – Nattrass

+0

포인터를 이동하면 아무 것도 추가하지 않습니다. ASCII에서 백틱은 96이고'<'는 60입니다. 버퍼는 분명히 {96,0,60,0,171,54, ...}로 시작합니다. (그리고 바이너리 데이터를 문자열로 출력하려고합니다.) [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)를 권하고 싶습니다. – molbdnilo

+0

'data'가 포인터라는 사실을 잊어 버린 것처럼 보입니다. 포인터에 2를 더합니다. –

답변

2

data + = 2;

< 인 문자열의 3 문자를 가리 킵니다 그래서, 당신은 단지 2 포인터를 증가 (60)

값으로 <을 결과 ㄱ 될 것으로 예상되지만 것이다

. 문자열이 끝나기 전에 임의의 값이 될 수도 있습니다.

은 포인터 포인트, 당신은 역 참조 포인터에있는 증가하려면

*data += 2; 

을하지만 dataconst char*로 선언되어 있기 때문에 이것은 컴파일러 오류를 트리거합니다.

문자열을 수정하려면 매개 변수를 char* data으로 변경하십시오.

+0

'* data + = 2'는'while (* data ++)'에서와 같이 포인터를 증가시킨 후 역 참조하는 것이라고 생각 했습니까? –

+0

@Stephan 먼저 포인터를 역 참조 한 다음 가리키는 값을 증가시킵니다. – zett42

+0

네, 맞습니다. 나는 방금'* data + = 1'이'* data ++'와 다른 것을 발견했습니다 ... –