programing

C 표준은 n개 요소 배열의 크기가 요소 크기의 n배가 되도록 요구합니까?

stoneblock 2023. 11. 5. 10:51

C 표준은 n개 요소 배열의 크기가 요소 크기의 n배가 되도록 요구합니까?

C 표준은 n개 요소 배열의 크기가 요소 크기의 n배일 것을 명시적 진술에 의해 또는 요구 사항에서 엄격한 논리적 추론에 의해 요구합니까?

예를 들어, 할 수 있습니다.int (*x)[5] = malloc(5 * sizeof **x);5개의 배열을 위한 충분한 공간을 요청하지 못함int?

C 2011 [N1570] 6.5.3.47은 다음과 같이 어레이의 엘리먼트 수를 계산하는 예를 보여줍니다.sizeof array / sizeof array[0]. 그러나 예는 표준의 규범적인 부분이 아닙니다(앞서 제8항에 따라).

6.2.520은 배열 유형이 특정 유형을 가진 연속적으로 할당된 비어 있지 않은 개체 집합을 설명하지만 필요한 총 메모리에 대해서는 침묵한다고 말합니다.

이는 언어 변호사 문제일 뿐이며 실제 구현은 무관합니다. (구체적인 예를 원하는 사람들을 만족시키기 위해 대용량 어레이에 대해 추가 메모리 관리가 필요한 C 구현을 가정해 보십시오. 따라서 어레이를 생성하려면 메모리 관리에 도움이 되는 추가 데이터를 생성해야 합니다.)

예, 배열 크기가 필요합니다.T[n]있다n * sizeof (T).

표준은 §6.2.5/20의 어레이를 다음과 같이 정의합니다.

배열 유형은 특정 멤버 개체 유형을 가진 연속적으로 할당된 비어 있지 않은 개체 집합을 설명합니다.

더 나아가.sizeofoperator는 배열의 총 바이트 수를 산출합니다( §6.5.3.4/4).

배열 유형이 있는 피연산자에 size of 를 적용하면 결과는 배열의 총 바이트 수가 됩니다.구조 또는 조합 유형을 가진 피연산자에 적용하면 내부 패딩과 후행 패딩을 포함하여 해당 객체의 총 바이트 수가 결과로 나타납니다.

배열은 개체의 연속적인 할당으로 구성되므로 내부 패딩이 있을 수 없습니다.그리고 트레일링 패딩은 다음과 관련하여 명시적으로 언급되기 때문에.sizeof연산자는 조합 및 구조의 맥락에서만 배열이 그러한 후행 패딩을 갖지 않을 것으로 예상되는 것은 분명합니다.

마지막으로, §6.2.6.1/4에 다음과 같이 명시되어 있습니다.

다른 개체 유형의 비트 필드가 아닌 개체에 저장된 은 n x CHAR_B로 구성됩니다.IT 비트(여기서 n은 해당 유형의 개체 크기)를 바이트 단위로 나타냅니다.값은 서명되지 않은 char[n] 유형의 개체(예: memcpy)로 복사될 수 있습니다. 결과적인 바이트 집합을 값의 개체 표현이라고 합니다.

배열에 후행 패딩 바이트가 있을 수 있다고 가정할 때, 배열을 고려합니다.unsigned char A[n], 그리고 배열을 좀 더 고려해 보겠습니다.unsigned char B[sizeof A], 모든 바이트(가능한 패딩 바이트 포함)에 적용할 수 있습니다.A[]복사되었습니다.지금이다,A[] 다음과 같은 크기여야 합니다.B[], 이후 (6.2.6.1/8):

둘 이상의 객체 표현을 갖는 값에 연산자가 적용되는 경우, 어떤 객체 표현이 사용되는지가 결과 값에 영향을 미치지 않아야 합니다.

이것은 다음을 의미할 것입니다.B[] 후행 패딩이 없어야 하는데, 이는 표준에 언급되지 않은 특정 특수한 조건 하에서 배열이 후행 패딩 바이트를 가질 수 있음을 의미하거나, 또는 배열이 배열을 제외하고 후행 패딩을 가질 수 있음을 의미합니다.unsigned char. 이 두 가지 가능성 중 어느 것도 표준에 언급되지 않았기 때문에 배열에는 애초에 후행 패딩이 없어야 한다는 결론을 내리는 것이 타당해 보입니다.

어레이의 표현을 설명하는 텍스트는 매우 간결하며 6.2.520에서 확인한 내용에 있습니다.

다음과 같이 개체 및 함수 유형에서 파생된 유형의 수는 얼마든지 구성할 수 있습니다.

  • 배열 유형은 요소 유형이라고 하는 특정 멤버 개체 유형을 가진 연속적으로 할당된 비어 있지 않은 개체 집합을 설명합니다.요소 유형은 배열 유형을 지정할 때마다 완전해야 합니다.배열 유형은 요소 유형과 배열에 포함된 요소 수에 따라 특성을 갖습니다.배열 유형은 해당 요소 유형에서 파생된 것이라고 하며, 해당 요소 유형이 T인 경우 배열 유형을 'T의 배열'이라고 부르기도 합니다.요소 유형에서 배열 유형을 구성하는 것을 '배열 유형 파생'이라고 합니다.

"연속적으로 할당된 비어 있지 않은 객체 집합과 패딩"과 같은 말은 하지 않으므로 배열은 단지 객체일 뿐입니다.따라서 다음과 같은 주장은 근거가 없는 것으로 보입니다.sizeof배열 [type]은 개체들의 연속적인 집합의 크기 이외의 결과를 산출할 수 있습니다. 이것은 명백하게N개별 요소 유형의 크기의 배입니다.

패딩은 존재하지 않도록 명시된 것이 아니기 때문에 스스로 존재할 수 있는 것이 아니라는 점도 주목할 필요가 있습니다.C는 유형 표현(6.2.6)을 지정하고 적절한 경우 비트와 바이트를 패딩할 수 있는 가능성을 명시적으로 지정합니다.배열에 대한 패딩에 대한 텍스트가 없으므로 배열 표현의 일부가 아닙니다.

언급URL : https://stackoverflow.com/questions/47522295/does-the-c-standard-require-the-size-of-an-array-of-n-elements-to-be-n-times-the