2013-01-15 3 views
0

전 C와 함께 일하고있다 ++ 및 몇 가지 이유로 그것이 루프의 예에 액세스하는 배열을 발견 할 때마다 나에게이 오류 메시지를주는 유지 :가 0xc0000005 : 액세스 위반 쓰기 위치 C++ 배열

int i2 = 0; 
for(int n=0; n<sizeof(mapy); n++) 
{ 
    xybar[i2] = mapx[n] * mapy[n];// 
    xbar_squared[i2] = mapx[n] * mapx[n];// 
    i2++; 
} 

이유 왜냐하면 필자는 값을 검사 할 때 iterator n이 배열 내의 위치 대신에 값 2006로 대체되어 다음 호출에서 실패로 끝나는 것을 알기 때문에 내 배열에는 500 개의 데이터 만 포함되어 있기 때문에 한계가 있습니다. 나는 i2가이 문제를 해결할 수 있다고 생각했지만 그렇지 않았다.

+9

포스트 정의. – hmjd

+1

정확히 동일한 방식으로 변경된 경우 i2와 n을 별도의 루프 카운터로 사용하는 이유는 무엇입니까? – tmaric

+6

여기에는 많은 문제가있을 수 있지만 문제는 'sizeof'가 생각하는대로하지 않는다고 생각합니다. 'mapy'의 타입은 무엇입니까? –

답변

5

여기서는 배열이 포인터가 아니라고 가정합니다. 그들은 sometype mapy[size]이고 sometype *mapy이 아닙니다. 이 경우 sizeof 연산자는 요소 수가 아닌 mapy 배열의 크기를 바이트 단위로 반환합니다. 배열의 유형이 1 바이트보다 큰 경우 (예 : int, float, double 등) 코드는 배열의 끝을 지나서 액세스 위반 예외에 액세스합니다. 대신 배열 요소의 수를 얻기 위해 sizeof(mapy)/sizeof(mapy[0])을 사용할 수 있습니다.

+4

'sizeof' 트릭은'mapy'가 진정한 배열이고 포인터가 아니라면 (배열을 인수로 선언 할 때 배열 구문을 사용할 때조차도 함수의 인수로 항상 전달되는 배열이되는 경우에만) 작동합니다. –

+0

배열 크기를 계산할 때는 sizeof 대신 [a function template] (https://gist.github.com/3959946#file-arrays-h-L33)을 사용하십시오. –

+2

사실, sizeof는 map이 동적으로 메모리를 할당하거나/또는 여분의 데이터를 포함하는 사용자 정의 유형 (예 : 요소 수의 카운터) 인 경우에도 실패합니다. – Agentlien

3

sizeof은 배열의 길이가 아니라 바이트 수입니다. mapy이 일반 포인터 인 경우이 값은 32 비트 시스템에서는 4이고 64 비트 시스템에서는 8 일 수 있습니다. 이것이 배열의 실제 요소 수가 아닌 경우 루프가 잘못되어 배열의 요소 수가 적 으면 경계를 넘어서고 있습니다.

mapy 실제 배열 인 경우

, 요소가 당신은 확실히 이러한 경우에 경계를 넘고있다 char 유형되도록하지 않는 한, 각 요소의 크기를 곱한 요소의 배열의 크기가 될 것입니다.

또한 xybar 및 mapx가 정의 된 곳을 볼 수 없지만 C++ 인 경우 배열이 아닌 std::vector을 사용해야합니다.

또한, "크기"요소들의 수와 관련하여 배열 한 방법이다 : mapy``xybar`과``xbar_squared`의

template< typename T, size_t N > 
size_t arraySize(T (arr&)[N]) 
{ 
    return N; 
} 
관련 문제