2016-10-07 1 views
1

int* array = new int[10];으로 배열을 만들고 배열의 일부에 값을 채우려면 배열의 채우기 양을 어떻게 확인할 수 있습니까? 루프를 통해 각 값이 기본값인지 확인하고 싶지만 각 배열 요소의 기본값이 무엇인지 잘 모르겠습니다. 그것은 null0 또는 가비지 값입니까?C++에서 배열의 기본값은 무엇입니까?

답변

3

이것은 C++에서 배열을 만들 때 기본값을 설정하는 방법입니다.

int array[100] = {0}; 

이제 모든 요소는 0으로 설정됩니다. 이 모든 요소를 ​​사용하지 않으면 쓰레기가되며 사용되는 경우 정의되지 않은 동작이됩니다.

모든 언어가 이와 같지는 않습니다. Java는 데이터 구조를 선언 할 때 기본값을 가지지 만 C++은 그렇지 않습니다.

2

기본값이 없으므로 가비지입니다.

+0

그러면 채워진 배열의 크기를 확인하여 요소를 삽입하기 전에 전체 배열을 초기화해야합니까? 그렇게하면 비교할 기본값이 생깁니다. – mysticalstick

+0

@johnmurphy 컴파일 할 프로그램에 대해 배열 크기를 선언해야합니다. 크기를 알아야합니다. –

1

유형이 int 인 경우가 아니라 원하는 것을 수행 할 수 없습니다.

배열의 초기화되지 않은 요소에는 예측할 수없는 값이 있습니다. 또한 이러한 요소에 액세스하면 정의되지 않은 동작이 발생합니다.

사용 할당시 센티넬 값으로 배열의 요소를 초기화 할 수 있습니다 :

int* ptr = new int[10]{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; 

-1하지 않는 경우에 당신을 위해 일하는 어떤 센티넬 값을 사용.

0

C++ 방식으로 문제를 해결할 수 있습니다. 구조체 또는 클래스을 만들 수 있습니다. 여기에는 값과 부울 플래그가 포함되어 있습니다. Bool 플래그는 기본 생성자에서 거짓으로 설정하고 true 연산자 =로 설정해야합니다. 해당 클래스의 구현이 준비되어 있습니다 (boost.optional). std :: optional은 C++로 존재한다. 어레이

#include <boost/optional.hpp> 
#include <iostream> 

int main() 
{ 
    const size_t nArr = 100; 
    auto pArr = new boost::optional<int>[nArr]; 
    const size_t nInit = 30; 
    for (size_t i = 0; i < nInit; ++i) 
    { 
     pArr[i] = i; //initialize nInit first values of pArr 
    } 
    size_t n = 0; 
    for (; n < nArr; ++n) 
    { 
     if (!pArr[n].is_initialized()) break; 
     // or more compact form: 
     //if(!pArr[n]) break; 
     assert(*pArr[n] == n); 
    } 
    std::cout << "nInit = " << nInit << ", n = " << n << std::endl; 
    assert(nInit == n); 
    delete[] pArr; 
} 
0

디폴트 값은 불확정는 가비지 수단이다.

어떻게 배열이 채워 졌는지 확인할 수 있습니까?

확인할 수 없습니다. C/C++에는 배열 범위 검사가 없습니다. 직접해야합니다. 사용자가 삽입 한 데이터를 추적해야합니다. 카운터가 배열의 크기에 도달하면 배열이 가득합니다.

관련 문제