2017-04-21 2 views
0

포인터의 2 차원 배열에 대한 포인터를 반환하는 함수를 작성하고 싶습니다. 나는이 배열을 가지고 :포인터의 2 차원 배열

Organism** getWorldTab() { 
    return worldTab[20]; 
} 

이 올바른지 : Organism* worldTab[20][20]; 내 친구가 내가 이런 식으로 원하는 함수를 작성하는 것이 좋다?

*temp = world.getWorldTab(); 

Visual Studio에서 예외를

Exception thrown: write access violation. 

    this->temp was 0xCCCCCCCC. 

을 던져 나는 getWorldTab() 기능에 문제가 확신 : 나는 (tempOrganism*** temp;입니다)이 작업을 수행 할 때.

worldTab 정의 :이 상황에서의 첫 번째 요소에 대한 포인터로 변환하고, 어레이에 대한 포인터는 포인터에 대한 포인터는 다르게 완전히 수 있지만 Organism* worldTab[20][20];

+5

'worldTab [20]'이 (가) 범위를 벗어납니다. –

+1

더 많은 문맥을 제공해야합니다. 'worldTab'은 어디에 정의되어 있습니까? – tadman

+2

http://stackoverflow.com/help/mcve를 읽고 질문을 수정하십시오. – Sniper

답변

1

배열, 포인터 아니다.

배열에 대한 포인터의 유형은 Organism* (*)[20][20]입니다.

배열의 첫 번째 요소를 가리키는 포인터는 아마도 친구의 염두에 두었지만 Organism* (*)[20]이 아니고 Organism** 또는 Organism***이 아니며 둘 중 하나로 변환 될 수 없습니다. 존재 스물의 21 배열 될 것이다. 그리고 당신은 액세스 위반의 원인 인 *temp에 할당하기 전에 temp를 초기화하지 않기 때문에

(그리고는 보너스로, worldTab[20]이 (가) 범위를 벗어났습니다.)

당신이

Organism* (*getWorldTab())[20] { 
    return &worldTab[0]; 
} 

Organism* (*temp)[20] = getWorldTab(); 

하거나

Organism* (*temp)[20] = worldTab; 

내 생각을 쓸 수 있지만 당신은 std::vectorstd::array을 사용하는 법을 배워야합니다 - 그들은 많은 고통을 덜어줍니다.
(또한 2017 년입니다. 재미있을 수도 있지만 1969 년처럼 프로그램 할 필요가 없습니다.)