[c] C로만 배열을 포함하는 구조체를 선언하는 이유는 무엇입니까?

다음을 포함하는 코드를 발견했습니다.

struct ABC {
    unsigned long array[MAX];
} abc;

이런 선언을 언제 사용하는 것이 합리적입니까?



답변

배열을 값으로 함수에 전달하거나 함수에서 값으로 반환 할 수 있습니다.

이러한 맥락에서 포인터로 붕괴되는 배열과 달리 Structs는 값으로 전달 될 수 있습니다.


답변

또 다른 장점은 크기를 추상화 [MAX]하여 객체를 선언 하는 모든 위치에서 코드 전체 를 사용할 필요가 없다는 것 입니다. 이것은 또한 달성 될 수있다

typedef char ABC[MAX];

그러나 훨씬 더 큰 문제가 있습니다 : ABC배열 유형 이라는 것을 알아야합니다 (type 변수를 선언 할 때 이것을 볼 수는 없지만 ABC) 그렇지 않으면 다른 ABC것을 의미한다는 사실에 찔릴 것입니다 함수 인수 목록과 변수 선언 / 정의에서.

또 다른 장점은 구조체를 사용하면 많은 코드를 다시 작성할 필요없이 필요한 경우 나중에 더 많은 요소를 추가 할 수 있다는 것입니다.


답변

구조체를 복사하고 함수에서 구조체를 반환 할 수 있습니다.

구조체의 일부가 아닌 한 배열로는 그렇게 할 수 없습니다!


답변

이렇게 복사 할 수 있습니다.

struct ABC a, b;
........
a = b;

배열의 경우 memcpy 함수 또는 루프를 사용하여 각 요소를 할당해야합니다.


답변

struct를 사용하여 string 과 같은 새로운 유형의 데이터를 만들 수 있습니다 . 당신은 정의 할 수 있습니다 :

struct String {
    char Char[MAX];
};

또는 함수의 인수로 사용하거나 메소드에서 리턴 할 수있는 데이터 목록 을 작성할 수 있습니다. 구조체는 =와 같은 일부 연산자를 지원할 수 있고 배열에 메소드를 정의 할 수 있기 때문에 배열보다 유연합니다.

그것이 당신에게 유용하기를 바랍니다 🙂


답변

그러한 a를 사용하는 또 다른 장점은 그러한 a 가 사용될 때마다 형식 안전성을 강제struct 한다는 것 입니다. 특히 서로 다른 목적으로 사용되는 동일한 크기의 어레이로 구성된 두 가지 유형이있는 경우 이러한 유형을 사용하면 실수로 어레이를 부적절하게 사용하지 않아도됩니다.struct

에서 배열을 래핑하지 않으면 struct여전히 배열을 선언 할 수 있습니다 typedef. 이로 인해 다음과 같은 장점이 있습니다. struct– 유형이 한 번 선언됩니다. • 크기가 자동으로 정확합니다. 코드는 유지 관리가 용이하지만 ◦ 엄격한 형식 안전성, ◦ 형식의 값을 복사 및 반환하는 기능 및 ◦ 나중에 나머지 코드를 손상시키지 않고 멤버를 추가 할 수있는 기능이 손실됩니다. typedef주어진 유형의 베어 배열에 대해 2 는 크기가 다른 경우에만 다른 유형을 생성합니다. 또한 함수 인수에 typedefwithout 를 사용하면 형식 안전성을 크게 줄이는 *것과 같습니다 char *.

요약하면 :

typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char   A_c_t[113];                   // Partial type-safety, not assignable

A_s_t          v_s(void);     // Allowed
A_c_t          v_c(void);     // Forbidden

void           s__v(A_s_t);     // Type-safe, pass by value
void           sP_v(A_s_t *);   // Type-safe
void           c__v(A_c_t);     // UNSAFE, just means char * (GRRR!)
void           cP_v(A_c_t *);   // SEMI-safe, accepts any array of 113


답변

구조에는 OOP 메모리 관리 패러다임의 장점 중 일부를 모방 한 배열 초기화, 복사 및 fini 함수가 포함될 수 있습니다. 실제로, 사용자 정의 구조를 관리하기 위해 sizeof () 구조를 사용하여 정확히 얼마나 많은 바이트가 관리되는지 알 수있는) 일반적인 메모리 관리 유틸리티를 작성하도록이 개념을 확장하는 것은 매우 쉽습니다. C로 작성된 많은 현명한 생산 코드 기반은 이것들을 많이 사용하며 일반적으로 범위가 매우 로컬이 아닌 한 배열을 사용하지 않습니다.

실제로 구조에 내장 된 어레이의 경우이 어레이에 액세스하려고 할 때마다 바운드 검사와 같은 다른 “스마트 일”을 수행 할 수 있습니다. 배열 범위가 매우 제한적이지 않으면 배열 범위를 사용하고 프로그램 전체에 정보를 전달하는 것은 좋지 않습니다. 조만간 밤에 깨어 주말을 망치게하는 벌레가 생길 것입니다.