2D 배열을 연결된 1D 배열로 처리할 수 있나요?
다음 코드 조각을 고려하세요.
int a[25][80]; a[0][1234] = 56; int* p = &a[0][0]; p[1234] = 56;
질문: 코드가 경계를 넘어 배열에 액세스하면 정의되지 않은 동작이 발생합니까?
답변: 예, 2행과 4행 모두 정의되지 않은 동작을 나타냅니다.
C에서 배열 인덱싱은 본질적으로 포인터 연산입니다. a[i][j]에 액세스하면 컴파일러는 이를 *(a[i] j)로 효과적으로 변환합니다. 마찬가지로 p[i]는 *(pi)를 나타냅니다.
이 경우 배열 a의 크기는 25 x 80입니다. 배열의 첫 번째 행인 a[0]에는 80개의 요소가 포함됩니다(범위: a[0][0] ~ a[0][79])이며 인접한 메모리 위치에 할당됩니다.
액세스하여 a[0][1234]인 경우, a[0]에는 [0, 79] 범위 내의 요소만 포함되어 있음에도 불구하고 코드는 첫 번째 행의 인덱스 1234에 있는 요소에 액세스하려고 시도합니다. 이는 범위를 벗어났으며 정의되지 않은 동작을 유발합니다.
4행에도 동일한 논리가 적용됩니다. p가 a[0]의 첫 번째 요소를 가리키는 동안 배열의 크기는 여전히 25 x 80입니다. p[에 액세스 1234]는 본질적으로 범위를 벗어난 포인터 산술 연산이며 다시 한번 정의되지 않은 동작으로 이어집니다.
게다가 언어 변호사로서 주석에서 지적했듯이 constexpr을 사용하는 유사한 코드 조각은 컴파일러가 상수 표현식에서 정의되지 않은 동작을 감지하기 때문에 컴파일에 실패합니다.
constexpr int f(const int (&a)[2][3]) { auto p = &a[0][0]; return p[3]; } int main() { constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, }; constexpr int i = f(a); }
이것은 다음을 사용하여 p[3]에 액세스하기 때문에 올바르게 컴파일됩니다. constexpr은 정의되지 않은 동작을 감지하고 오류를 발생시키도록 컴파일러를 트리거합니다.
위 내용은 경계를 넘어서는 포인터 연산을 사용하여 2D 배열 요소에 액세스하면 정의되지 않은 동작이 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!