2012-01-27 2 views
0

다음과 같은 포인터 표기법의 차이점을 이해할 수없는 사람이 나를 안내해 주시겠습니까? 포인터 구문 쿼리

typedef struct some_struct struct_name; 
    struct_name this; 
    char buf[50]; 
    this = *((some_struct *)(buf)); 

가 지금은 조금 주위에 재생하려고하고 같은 위의 일을했다 : 지금까지 내가 모두 구현은 동일한 결과를 생성해야한다고 생각 걱정으로

struct some_struct * this; 
    char buf[50]; 
    this=(struct some_struct *)buf; 

, 누군가가 나를 인도 할 수 둘 사이에 차이가 있는지, 그렇다면 네가 지적 할 수 있는가?

감사합니다.

+1

변수 이름으로 "this"를 사용하는 습관을 벗어나십시오. C를 지금하고 있다면, 언젠가 C++을 할 것이며, 그 습관을 후회할 것입니다. –

+0

@PaulTomblin : C 및 C++은 다른 언어입니다. 나는 C에서 변수 이름으로 "this"를 사용하는 것이 그렇게 큰 거래라고 생각하지 않는다. –

+0

@ Paul Tomblin 조언을 주셔서 감사합니다. 실제로 의도적으로 변수 이름으로 쓴 내용을 정리하고 싶었습니다. – Abdullah

답변

3

첫 번째 코드에서 this은 포인터가 아니며 some_struct의 인스턴스입니다. 할당 한 내용이 마치 some_struct 인 것처럼 buf에있는 내용의 얕은 사본 (예 : memcpy())을 작성했습니다.

두 번째 코드에서 this은 포인터이고 주소는 buf입니다.

기본적으로 요약하면 첫 번째 코드 단 this은 포인터가 아니므로 구조체가이 구조체에 복사됩니다. 두 번째에서는 포인터이며 buf과 동일한 메모리에 할당됩니다 (즉, 복사본이 아닙니다).

+0

고마워요, 설명해주세요. :) – Abdullah

+0

@Abdullah, 너는 너무 빠르다. 이 답변은 정확합니다 (그리고 +1을주었습니다). 그러나 코드에 숨어있는 문제는 알려주지 않습니다. 내 대답도 참조하십시오. –

0

"this"는 "buf"의 첫 번째 메모리 위치를 가리 킵니다. 첫 번째 예에서는 컴파일러 오류가 발생합니다 (C로 구조체를 할당 할 수 있다고 생각하지 않습니다 =, 나 잘못 될 수 있음) 또는 buf (sizeof (struct_name)까지)의 내용이 복사됩니다 스택에있는 이것에.

0

두 가지 방법 모두 문제점이 있습니다.

  • 정렬 : buf은 구조 유형의 변수에 맞게 정렬되지 않을 수 있습니다. 그렇다면 정의되지 않은 동작 (UB)이 생성됩니다. 최상의 경우 프로그램을 중단하지만 그보다 더 나쁜 것일 수 있습니다.
  • 초기화 : 첫 번째 경우에는 초기화되지 않은 메모리에 액세스하여 읽습니다. 비정상적인 데이터를 제공하는 가장 좋은 경우는 임의의 바이트입니다. 최악의 경우 char은 플랫폼에 부호가있는 정수 유형이며 위와 같이 char => UB에 대한 트랩 표현을 사용합니다. (당신이 포인터의 다른 쪽 끝에서 개체에 액세스하려고하면 두 번째 경우, 동일한 문제가 발생합니다.)

어떻게 모든 것을 피하기 위해 : 당신의 변수를 초기화

항상
  • 을 . 모든 경우에 간단한 = { 0 }가 있어야합니다.
  • 바이트에 대한 일반적인 유형으로 char를 사용하지하지만
  • unsigned char 다른 데이터 유형으로 임의의 정렬 바이트 버퍼를 던져 결코 사용하지 마십시오. 필요할 경우 struct 개체를 unsigned char으로 전송하십시오.
+0

고마워요 옌스, 나는 미래에 이러한 실수를 피하려고 노력합니다, 건배 :) – Abdullah