2013-03-05 4 views
-1

나는 이해하지 못하는 버그가 있습니다. 단지 그것을하지 않습니다 ...구조체 * p! = C의 주소

static struct ProgramList{ 
    struct Program *program; 
    struct ProgramList *next; 
} programs = {NULL, NULL}; 

struct ProgramList *p = &programs; 

:이 코드 조각에서

는 P의 값은 프로그램에서 주소 여야합니다. p의 주소는 0x0097c130이고 프로그램의 주소는 0x0097c144입니다.

어떤 아이디어가 필요합니까?

편집 : Microsoft Visual Studio에서 작업하고 있습니다. 디버거의 감시 기능으로 주소를 확인하고 있습니다. p와 & 프로그램을 확인하고 있습니다. 편집 2 : p의 주소는 0x0040f89c입니다. 나는 그것이 주소가 아닌 p의 가치를 찾고 있음을 안다.

struct ProgramList *p = &programs; 
printf("%p %p\n", p, &programs); 

을 그리고 당신은 그들이 동일 표시되어야합니다 주소를 확인하는

+5

어떻게 당신은 그 주소를 확인하고 있습니다? – Mike

+2

'p '의 _address_를 (를) 확인하고 계십니까? –

+1

'p '를'& p'와 혼동하지 않으시겠습니까? –

답변

2

귀하의 방법이 잘못이 시도. 당신이 뭔가를하고있는 것 같아요 :

printf("%p %p\n", &p, &programs); 

당신의 포인터의 주소입니다 (그 값이 아닙니다).

편집
귀하의 의견에 따라, 당신은 그 printf를 통해 확인뿐만 아니라 조건이 올바른지 한 수 있습니다 당신은 VS의 디버거를 사용하고 말했다 때문에

if(p == &programs) 
    printf("I failed"); // will print "I failed" because the values are the same. 

내가 그것을 떨어져 가루와 붙어 그것은 마이크로 소프트 트릭하지 그래서 심지어 VS 2010 년이 같은 값을 보여주는 것처럼 거기에 그 코드는 같습니다

enter image description here

+0

내가 찾는 주소가 아님을 알게 될 것입니다. 이상한 것은 내가 이것을 더하면 다음과 같다. if (* p == & programs) printf ("실패했다"); 아무 것도 출력하지 않습니다. – Tremnor

+0

@Tremnor - 원하는 문제가 있습니다. if (p == & programs) printf ("실패했습니다");'내 버전에서'* '제거에 유의하십시오. – Mike

+0

예 죄송합니다. 복사하여 실제 코드에서 붙여 넣으십시오. 이것은 실제 코드입니다 : if (p! = & programs) printf ("I failed"); – Tremnor

4

티 S :

BF의 @의 BF-노트북 :

int main(int argc, char **argv) { 
    struct P *p = &programs; 
    printf("%p %p %p\n", &programs, p, &p); 
} 

는이 결과가 ~/놀이터 $의 ./testprogram을

0x804a01c의 0x804a01c의 0xbfe32a4c

그래서, &programsp 동일하지만, p의 주소가 다릅니다.

기본적으로 &programs은 구조체 programs이 위치한 주소입니다. pprograms에 대한 주소가 저장되는 위치입니다. &p은 해당 주소가 저장된 주소입니다. 개략적에서

:

[address] [name] [value] 
0x804a01c programs <programs struct> 
0xbfe32a4c p   0x804a01c