2012-08-25 4 views
0

sizeof()에 문제가 있습니다. 내가 전에 만든 클래스에 포인터가 있습니다. 그리고이 포인터는아무 것도 참조하지 않는 포인터의 크기

static Book* books; 

으로 초기화되므로 아무 것도 가리 키지 않습니다. 포인터가 어떤 배열을 가리키고 있는지 확인하고 싶습니다. 첫 번째 질문은 배열을 가리 키기 위해 런타임 중에이 포인터의 주소를 변경할 수 있기 때문에 수행 할 솔루션이 무엇인가하는 것입니다. 내가 sizeof (포인터)를 사용하려고하지만 그것은 충분히 도움이되지 않습니다. 반환 값은 4입니다. 어떤 식 으로든 말하면 나는 이렇게 평가할 수 있습니다.

이 내 클래스 :

class Tool 
{ 

private: 
    static Book* books; 

public: 

    static char* pgetStringIntoArray(string); 
    static string* pgetStringFromArray(char*); 
    static void printCharArray(char*); 
    static bool* addBook(Book*); 
    static bool* isStored(Book*); 
}; 

그리고이 문제가 갖는 방법 :

bool* Tool::isStored(Book* book) 
{ 
    bool* stored = new bool(false); 
    if(Tool::books) 
    { 
     cout << "NULL" << endl; 
    } else { 
     return stored; 
    } 

} 
+1

'sizeof (books)'는'sizeof (Book *)'의 편리한 대안입니다. 표준 C++에서'sizeof'는 항상 컴파일 타임에 평가되며 런타임에 실제로 값을 검사하지 않습니다. 단지 관련 유형을 살펴 봅니다. 0으로 나누기 오류없이 sizeof (1/0)을 쓸 수도 있습니다; – fredoverflow

+0

가능한 [sizeof (배열을 가리키는 포인터)를 찾는 방법] (http://stackoverflow.com)/question/492384/how-to-find-the-sizeofa-pointer-to-an-array) –

답변

4

아니, 당신은 포인터가 뭔가를 가리키고 있는지 확인 sizeof을 사용할 수 없습니다. sizeof 포인터는 동일한 아키텍처에서 항상 동일한 크기입니다.

당신은이 작업을 수행 할 수 있습니다 : 당신이 유효한 null이 아닌 값을 가리키는 것 있는지 확인하려는 경우,

Tool::Book* books = NULL; 

을 그리고, 바로 수행

if (Tool::books) { 
    // books is pointing to something 
} 

당신을 위해 메모리를 할당 할 때마다 pointer (array). 할당이 성공하면 포인터는 더 이상 null이 아닙니다. C++을 사용 중이므로 std::vector을 사용하여 배열 (포인터) 대신 동적 치수의 배열을 보관하는 것이 좋습니다.

+0

Thx하지만 컴파일러에서 오류가 발생했습니다. 오류 : 비 정적 클래스의 정적 데이터 멤버의 클래스가 초기화되지 않았습니다. 정수 타입 'Book *' –

+1

@ErayTuncer : 오른쪽. '= NULL' 부분은 필요 없습니다. –

+0

이제는 if 문에서 다음과 같이 설명합니다 :'Tool :: books '에 대한 정의되지 않은 참조 –

1

C, C++과 같이 정적으로 형식이 지정됩니다. sizeof 연산자가 반환하는 다양한 형식 크기는 컴파일 타임에 결정되며 변경되지 않습니다.

당신이 묻는 것을 수행하는 올바른 방법은 포인터를 NULL으로 초기화하고 나중에 그것을 확인하는 것입니다. NULL은 유효한 메모리 주소를 참조하지 않기 때문에 존재하지 않는 포인터 대상에 대한 좋은 표시가됩니다. 어쨌든 포인터를 초기화하는 것은 좋은 습관입니다. 초기화되지 않은 포인터를 역 참조하지 않을 때 발생하는 잠재적 인 문제와 메모리 오류가 발생할 수있는 문제를 방지 할 수 있습니다.

그리고 네, 명시 적으로 변수의 나머지 부분을 초기화하는 것도 좋은 생각입니다 ...

편집 :

하나 그리 사소한

: C 및 C++ 프로그램에서 정적 필드는 실행 파일의 특별한 섹션 (예 : BSS)에 저장되며 프로그램이로드 될 때 자동으로 0으로 초기화됩니다. 따라서 정적 포인터를 명시 적으로 NULL으로 초기화 할 필요가 없습니다. 당신을 위해 이미 완료되었습니다 ...

1

sizeof보다 포인터를 이해하는 것이 더 문제가됩니다.

sizeof은 컴파일 시간이 인 입니다. 포인터의 경우 항상 sizeof(void*) (대부분 64 비트 아키텍처에서는 8 바이트)을 반환합니다. VLA s를 제외하고 sizeof은 컴파일 시간 상수를 반환합니다.

C는 예를 들어 malloc의 결과 (포인터 연산을 할 수 있기 때문에)의 뾰족한 영역의 사용 된 크기를 알지 못합니다. 필요한 경우 혼자서 관리해야합니다.

관련 문제