2014-09-28 5 views
0

내 코드에 대한 경고를 이해하지 못합니다. 그것은 단순 해 보이지만 나는 그것을 얻지 못한다. 나 이전에 의해 정의 된 구조체호환되지 않는 포인터 유형에 대한 경고

chunk* findChunk(chunk *ptr, int size) 
{ 
    ... 
    chunk *newNode = ptr->end + size; 
    ... 
} 

덩어리입니다 : 여기에 코드의 문제가있는 부분은

typedef struct chunk 
{ 
    int size; 
    int available; 
    struct chunk* next; 
    char end[1]; 
} chunk; 

가 그리고 이것은 경고이다 나는 나타납니다

warning: initialization from incompatible pointer type [enabled by default]<br> 
chunk *newNode = ptr->end + size; 

난 못해 uderstand, 나에게 분명히 newNode와 ptr은 같은 타입이다. 내가 뭘 놓치고 있니? 고마워.

+0

'newNode'와'ptr'는 같은 타입이지만 'ptr-> end + size' ('ptr-> end'와 같은 타입입니다)는'char *'타입입니다. – mafso

답변

4

서로 다른 유형을 가리 키도록 선언 된 두 개의 포인터를 동일시 할 때 호환되지 않는 경고 유형이 발생합니다. 아마도 코더로서 당신이 작동 할 것이라는 것을 알고 있기 때문에 가능하지만 보통 그렇지 않을 것이므로 경고를받는 것입니다. 코드에서

, 당신은 char *을 입력 가지고는 1x1 문자 배열로 구조체의 end 필드를 정의했지만, 첫 번째 코드에서, 당신은 chunk *과 동일시하려는. 코드에서 end 대신 next을 사용한다는 의미 일 수 있습니다.

또한 내가하고있는 것을 절대적으로 확신하지 않는 한 포인터에 정수를 사용하는 것을 강력히 권장하지 않습니다. 그리고 그때조차도 당신이 시도하고있는 것을 달성하는 데 더 안전하고 좋은 방법이있을 것입니다.

또한 왜 단일 요소로 문자 배열을 만드나요? 그건 나에게 이상한 것 같다.

+2

pre-c99 pre gnu struct hack –

+0

제약 조건 위반입니다. 허용되지 않습니다. 컴파일러는 불평해야하며 컴파일을 거부 할 수 있습니다. 해당 변환에는 형 변환이 필요합니다. 그리고 포인터 연산에 무슨 문제가 있습니까? – mafso

+0

malloc 함수를 구현하려고하는데, 링크 된 목록으로 사용 가능한 (사용 가능한) 메모리를 관리하고 있습니다. 사용자가 일부 메모리를 필요로하지만, 청크가 요청 된 메모리보다 큽니다. 그래서이 코드 조각에서이 노드를 두 개로 분할하려고합니다. 이 설명이 명확한 것인지 아닌지 나는 알지 못합니다. 난 그 newNode 포인트를 더 원한다. 그래서 그것을 나눌 수있다. 하지만 네가 대답 한 것에 대해 감사 드린다. char end [1]은 메타 데이터의 끝을 표시하기위한 것이 었습니다 (할당 할 실제 메모리 앞에옵니다). –

관련 문제