2011-08-24 4 views
-1

코드에 관하여 :C 언어 : 왜 NULL이 나옵니까?

tp는 테이블이 들어있는 특정 구조체에 대한 포인터입니다.

테이블은 다른 구조체의 포인터에 대한 포인터이며, 배열로 사용됩니다.

크기는 테이블 크기에 불과합니다. NULL로

어레이의 모든 셀을 초기화하기 위해이 함수를 송신 veriables

임.

이 라인 : 나 어레이 내의 객체

가 NULL로 초기화되고 가리키고 있음을 알 수 이클립스 디버거를 사용

void initArr(ObjectP* array,int size) 
{ 
    int i; 
    for (i = 0; i < size; ++i) 
    { 
     array[i]=NULL; 
    } 
} 

:

initArr(tp->table,tp->size); 

이 함수에 보낸다 메소드가 끝나면

tp-> table이 NULL입니다.

포인터가 사라 졌나요?

도와주세요.

구조체 :

테이블 :

typedef struct Table 
    { 
     size_t size; 
     hashFcn hash; 
     printFcn print; 
     comparisonFcn comp; 
     ObjectP* table; 
     int duplicated; 
    }Table; 

목적 :

typedef struct Object 
    { 
     void *key; 
     ObjectP pointsTo; 
    }Object; 
+2

어느 쪽입니까? C 또는 C++? 제가 여러분에게 드릴 조언은 그것이 무엇인지에 따라 아주 다를 것입니다. – Flexo

+1

'struct '를 게시하십시오. –

+0

왜'void'를 반환하는 함수에서 뭔가를 반환합니까? – Constantinius

답변

0

배열과 포인터는 비슷하지만 다르다.

포인터의 배열은 메모리의 연속 포인터 (배열의 첫 번째 포인터가 상주하는 주소)로 표현할 수 있습니다.

이러한 상황에서 tp-> table은 tp-> table [0]과 완전히 동일하지만 [0]은 (동일한 주소를 가졌기 때문에) 가정됩니다. 이 방식으로 구현 된 시스템에서 tp-> table은 주소를 지정하고 그 주소로부터의 오프셋 (배열 요소에 도달하기 위해)은 데이터 유형 크기 (또는 포인터의 크기 케이스).

tp->table (the base address 0x00000100) 
tp->table[0] (the address 0x00000100 + 0 * sizeof(... pointer ...) = 0x00000100) 
tp->table[1] (the address 0x00000100 + 1 * sizeof(... pointer ...) = 0x00000104 (some systems only)) 
tp->table[2] (the address 0x00000100 + 2 * sizeof(... pointer ...) = 0x00000108 (some systems only)) 

그래서 디버거는 실제로> 테이블 [0] 컴파일러의 구현에 따라 tp- 정확히 동일합니다 tp-> 테이블을 인쇄 할 수 있습니다.

0

(당신이 무효 기능에서 뭔가를 반환하는!) 잘못된 것 같다,하지만 난 '발표와 같은 코드 야생 추측을 취하고 실제 코드에서 initArr 내부에 (아마도 malloc을 통해) "배열"을 설정하려고한다고 가정합니다.이 경우에 우리는 고전적인 것을 가지게됩니다 : 당신은 tp-> table 지금 당신은했습니다 -

도현 : 값에 의해 , 그것은 initArr에 의해 변경되지 않도록이 : initArr는 initArr이 끝날 때 :

편집 삭제됩니다 tp-> 테이블의 로컬 복사본에 운영 내 추측이 잘못된 것 같아. :/맞다면 칭찬을 상상해보십시오! :)

+0

내 코드를 편집했는데 실수였습니다. – Itzik984

관련 문제