programing

크기가 0인 배열

stoneblock 2023. 6. 18. 10:09

크기가 0인 배열

오늘 우연히 1차원의 크기가 0인 2차원 배열을 정의했지만 컴파일러는 불평하지 않았습니다.저는 적어도 gcc의 경우 이것이 합법적이라고 명시하는 다음을 찾았습니다.

6.17 길이 0의 배열

그러나 이 사용법에 대해 두 가지 질문이 있습니다.

첫째, 이것이 좋은 프로그래밍 관행으로 간주됩니까?만약 그렇다면, 우리는 현실 세계에서 언제 그것을 사용해야 합니까?

두 번째로, 제가 정의한 배열은 2차원이었고, 1차원에 대한 크기는 0이었습니다.이것이 1차원 케이스와 동일합니까?예를들면,

int s[0]
int s[0][100]
int s[100][0]

메모리와 컴파일러에서 모두 동일합니까?

편집: Greg에게 회신:제가 사용하고 있는 컴파일러는 gcc 4.4.5입니다.이 문제에 대한 나의 의도는 컴파일러에 의존하지 않지만, 만약 컴파일러에 특정한 특이점이 있다면 도움이 될 것입니다:)

잘 부탁드립니다!

C++에서 길이가 0인 배열을 선언하는 것은 불법입니다.따라서 코드를 특정 컴파일러 확장자에 연결하는 것은 일반적으로 좋은 방법으로 간주되지 않습니다.동적 크기의 어레이를 사용하는 많은 경우 다음과 같은 컨테이너 클래스로 더 잘 대체됩니다.std::vector.

ISO/IEC 14882:2003 8.3.4/1:

상수 표현식(5.19)이 존재하는 경우, 정수 상수 표현식이어야 하며 그 값은 0보다 커야 합니다.

그러나 길이가 0인 배열을 동적으로 할당할 수 있습니다.new[].

ISO/IEC 14882:2003 5.3.4/6:

직접-신규 선언자의 표현식은 음이 아닌 값을 가진 적분 또는 열거형(3.9.1)을 가져야 합니다.

저는 이 프로그램을 ideone.com 에서 실행했습니다.

#include <iostream>

int main()
{
    int a[0];
    int b[0][100];
    int c[100][0];

    std::cout << "sizeof(a) = " << sizeof(a) << std::endl;
    std::cout << "sizeof(b) = " << sizeof(b) << std::endl;
    std::cout << "sizeof(c) = " << sizeof(c) << std::endl;

    return 0;
}

모든 변수의 크기를 0으로 지정했습니다.

sizeof(a) = 0
sizeof(b) = 0
sizeof(c) = 0

따라서 위의 예에서는 메모리가 할당되지 않습니다.a,b또는c.

gcc로 당신의 예시를 컴파일하면, 그들 세 명 모두는sizeof0, 그래서 저는 그들 모두가 컴파일러에 의해 동등하게 취급된다고 가정합니다.

당신의 링크는 모든 것을 설명합니다.이 필드는 컴파일 시 구조체의 길이를 알 수 없는 경우 구조체의 마지막 필드로 사용됩니다.스택이나 다른 선언 중간에 사용하려고 하면 다음 요소를 덮어쓰게 됩니다.

언급URL : https://stackoverflow.com/questions/6180012/array-with-size-0