2012-03-04 5 views
0

I 메모리에 두 변수의 주소를 비교하려고의 변수에 대한 메모리 주소를 비교 :확인 및 다른 종류의

typedef struct chunk_tag { 
    struct chunk_tag *next; /* next node in list */ 
    int size; /* size of node in units, not bytes */ 
} chunk_t; 

내가 컴파일러를 얻을 : 여기

chunk_t *old_chunk, *new_chunk; 

    if(&(old_chunk + 1 + old_chunk->size) == &new_chunk) { } 

것은 chunk_t의 프로토 타입입니다 "if 값이 단 하나 '&'피연산자로 필요합니다.

int old_chunk-> size 및 chunk_t old_chunk를 추가했기 때문에 생각했습니다. 따라서 old_chunk-> size를 if 문에서 chunk_t로 typecase하고 컴파일러에서 "비 스칼라 유형으로 변환 당신이 & 연산자의 주소를 취할 수 없도록

old_chunk + 1 + old_chunk->size 

는, 좌변하지

+0

new_chunk를 다음과 같이 선언해야합니까? new_chunk 또는 * new_chunk? –

+0

내 잘못, 그것은 코드에서 포인터로 선언되었다,하지만 내가 그것을 쓴 때 오타가 있었어. 감사합니다 –

+0

'chunk_t' 객체에 대한 포인터의 주소 나'chunk_t' 객체의 주소를 비교하고 싶습니까? 큰 차이가 있습니다. – Irfy

답변

1

계산 된 값의 주소를 사용할 수 없습니다. 주소를받는 것은 스택의 어딘가에 이미 할당 된 값에 대해서만 작동합니다.

"12을 합친 값의 주소는 무엇입니까?"라고 상상해보십시오. 계산 된 값이기 때문에 주소가 없습니다. 메모리를 직접 조작 할 수 있으려면 변수 또는 계산 된 메모리 위치가 있어야합니다. 코드는 당신이 당신의 주소가 &없이 확인하고 싶은, 어떻게 생겼는지에서

: 당신의 변수가 모두 포인터chunk_t에 객체이기 때문에

if(old_chunk + 1 + old_chunk->size == new_chunk) { } 

즉.

당신이하고있는 일을 정확히 알고 있는지 확인하십시오. 1old_chunk에 추가하면 old_chunk이 가리키는 메모리보다 나중에 sizeof(chunk_t) 바이트가 메모리에 있음을 의미합니다. 반대로 old_chunk->size을 추가하면 sizeof(chunk_t) * old_chunk->size 바이트가됩니다.

+0

알겠습니다. 두 vars 포인터를 잡고, 그래서 == & new_chunk 대신 == new_chunk 않을까요? –

+0

변수를 잘못 선언했기 때문에 나중에 질문을 수정했습니다 :-) – Irfy

+0

좋습니다. old_chunk-> size를 추가하는 것이 integer * size 바이트 만 추가하는 것을 의미하는지 궁금합니다. 그게 내가 원하는 sizeof (chunk_t) * size 바이트를 추가하는 것이다. 대단합니다, 고마워요! –

0

다음 표현식 "요청했다. 이것은 컴파일러가 첫 번째 오류 메시지로 말한 것입니다.

두 번째 오류 메시지는 잘못된 유형 변환을 시도했음을 알려줍니다.

(chunk_t) old_chunk->size 

size가 원시 형의 경우 유효하지 않습니다 : 당신이 이런 일을 한 것 같다.

+0

흠. 그래서 그 주소를 변수로 저장하고 비교하는 대신 그 주소와 비교해보아야합니까? –

+0

@Josh 아니요, 당신은 잘못된 길로 생각하고 있습니다. – Irfy

0

&(old_chunk + 1 + old_chunk->size)은 필요하지 않습니다. 간단히 old_chunk + 1 + old_chunk->size입니다. 또한 old_chunk->size >= 0이 구조체에 int으로 선언 되었기 때문에 확인하는 것이 좋습니다.

P. '프로토 타입'이 아닙니다. 그것은 구조의 정의입니다.

+0

알겠습니다. 정수 추가에 대한 질문이 있지만, old_chunk가 chunk_t var이고 old_chunk-> size가 정수 인 경우 정수를 추가하지 않고 그냥 chunk_t의 바이트 수 대신 정수 * 크기의 바이트 수를 추가합니다. *크기? –

0

new_chunk 선언이 한 가지 있습니다. old_chunk가 chunk_t에 대한 포인터 인 * chunk_t로 선언되는 동안 이것은 chunk_t로 선언됩니다.당신이 경우

chunk_t * old_chunk, *new_chunk; 

if((old_chunk + 1 + old_chunk->size) == new_chunk) { 
    printf("some message"); 
} 

그런 다음 작동하므로

은 당신의 코드를 다시 작성합니다. 또는 적어도 컴파일하십시오.