2014-09-02 2 views
0

유형에 대한 포인터를 다른 유형에 할당하는 것은 불법입니다. 예 :이 책의 내용 :포인터 변환

C How To Program 7 ed. pag. 둘 형 무효 *의없는 경우 다른 유형의 포인터에 한 종류의 포인터를 할당 299

일반적인 프로그래밍 오류 7.7 구문 오류입니다.

하거나 URL에서

다음 C11 표준에

하지만 hower 기입된다

객체 유형에 대한 포인터는 다른 오브젝트 유형에 대한 포인터로 변환 될 수있다. 결과 포인터가 참조 된 형식에 맞도록 과 일치하지 않으면 동작이 정의되지 않습니다. 그렇지 않으면 다시 변환 할 때 결과는 과 원래 포인터를 비교해야합니다.

정렬 문제가있는 경우에만 동작이 정의되지 않았 음을 이해합니다.

사실 GCC 4.8 또는 cl 2013과 같은 컴파일러는 호환되지 않는 포인터 유형에서 할당 경고 만 내 보냅니다.

void 포인터에 대한 예외가 없습니다.

그래서 :

int a = 10; 
float b = 100.22f; 

int *p_a = &a; 
float *p_f = &b; 

p_a = p_f; // NOT ILLEGAL but WARNING 
p_f = p_a; // converted back again. it still works 

void *v_p = p_a; // NOT ILLEGAL NO WARNING 
p_a = v_p; // converted back again. it still works 

내가 잘 이해합니까? 또는 나는 무엇인가 놓치고 있냐?

P. "정렬 문제"의 예를 보여줄 수 있습니까?

+0

아마도 이러한 "많은 책"이 무엇인지, 실제로 말한 내용을 말할 수 있습니까?사용중인 gcc의 버전과 경고의 의미 또한 어떤 연구를 수행했는지, 어떤 부분을 이해하지 못했는지 알려주십시오. – Useless

+0

@Useless, 형식에 대한 포인터를 다른 형식의 포인터에 할당하는 것이 LEGAL인지 또는 void *로 처리하는지 이해할 수 없습니다. 표준을 위해 그것이 합법적이라는 것을 이해하는 것 같습니다. – xdevel2000

+0

다른 유형의 다른 포인터를 지정하는 것이 "SYNTAX 오류"라고 책에 쓰여 있다면 책이 잘못되었습니다! – Jay

답변

2

포인팅 된 데이터에 대한 포인터의 오프셋을 포인터의 유형과 상관없이 고려할 수 있습니다. 모든 표준 포인터 (스마트 포인터가 아닌)는 시스템 (32 비트 또는 64)에 따라 고정 된 크기를가집니다. 그래서 각각을 다른 현대 컴파일러에 할당하면 위험한 작업에 대해 경고하지만 문제는 호환되지 않는 유형의 포인터를 역 참조하려고 할 때입니다. 역 참조하면 열을 얻을 것이다 역 참조 Pb를 옆에 예를

int b = 10; 
int* pB = &b; 
double* pA = pB; 

에 있도록 응용 프로그램 (INT의 크기가 4 바이트), 뾰족한 형태에 대응하는 바이트 수를보고, 역 참조는 pA에 당신은 쓰레기를 얻을 것이다 또는 다음 4 바이트 (double은 8 바이트)가 다른 변수에 할당 된 메모리 공간이 될 수 있기 때문에 충돌이 발생합니다.

결론 : 포인터 유형을 서로 할당 할 때 포인터 유형을 추적하고, 특히 간접적으로 void *를 매개 변수로 사용하는 경우 포인터 유형을 추적하십시오. 포인터 할당의 합법성 또는 불법성은 컴파일러의 문제이며, 오래된 것들은 당신에게 경고하지 않았다. void *에 대입하는 것은 일반적이고 참조 할 수없는 포인터 유형 (참조 크기가 정의되지 않았고 그 제한은 C 언어 제한)이기 때문에 "위법"으로 간주되지 않을 수 있습니다. 따라서 위의 예와 같은 오류를받을 수 없습니다.