C에서 어레이만 포함하는 구조를 선언하는 이유는 무엇입니까?
다음과 같은 코드를 발견했습니다.
struct ABC {
unsigned long array[MAX];
} abc;
언제 이런 선언문을 쓰는 게 말이 되나요?
배열을 함수에 값으로 전달하거나 함수의 값으로 반환할 수 있습니다.
이러한 컨텍스트에서 포인터로 감쇠하는 배열과는 달리 구조체는 값으로 전달될 수 있습니다.
하나의 은 크기를 굳이 를 추상화하지입니다.[MAX]
코드 전체에 퍼지게 됩니다.이것은, 다음의 방법으로도 실현할 수 있습니다.
typedef char ABC[MAX];
더 . 더 큰 문제가 . 즉, 더 큰 문제가 있다는 것을 .ABC
유형입니다( 유형 를 선언할 ABC
, 여러분은 이 느껴지지 않을 ABC
는 함수 인수 목록과 변수 선언/정의에서 다른 것을 의미합니다.
또 하나의 장점은 구조를 통해 나중에 필요한 경우 많은 코드를 다시 작성할 필요 없이 요소를 추가할 수 있다는 것입니다.
구조는 OOP 메모리 관리 패러다임의 장점을 에뮬레이트하는 어레이 초기화, 복사 및 fini 함수를 포함할 수 있습니다.실제로 이 개념을 확장하여 범용 메모리 관리 유틸리티를 작성하고(sizeof() 구조를 사용하여 관리되는 바이트 수를 정확히 알 수 있음) 사용자 정의 구조를 관리하는 것은 매우 쉽습니다.C로 기술되어 있는 스마트 실가동 코드 베이스의 대부분은, 이러한 코드의 사용율이 높고, 일반적으로 어레이의 범위가 매우 로컬이 아니면 어레이를 사용하지 않습니다.
실제로, 구조체에 짜넣어진 어레이에서는, 이 어레이에 액세스 하고 싶을 때에 바인드 체크 등, 그 외의 「스마트한 작업」을 실시할 수 있습니다.어레이의 범위가 매우 한정되어 있지 않는 한, 어레이를 사용하고, 프로그램에 정보를 전달하는 것은 좋지 않습니다.조만간, 여러분은 밤에 잠을 못 자게 하고 여러분의 주말을 망칠 벌레들과 마주치게 될 거예요.
구조물을 복사하고 함수에서 구조물을 반환할 수 있습니다.
구조체의 일부가 아닌 한 배열에서는 이 작업을 수행할 수 없습니다.
이렇게 베끼면 돼요.
struct ABC a, b;
........
a = b;
배열의 경우 memcpy 함수 또는 루프를 사용하여 각 요소를 할당해야 합니다.
구조를 사용하여 문자열과 같은 새로운 데이터 유형을 만들 수 있습니다.다음과 같이 정의할 수 있습니다.
struct String {
char Char[MAX];
};
또는 함수 인수로 사용할 수 있는 데이터 목록을 만들거나 메서드에서 반환할 수 있습니다.이 구조는 =와 같은 일부 연산자를 지원할 수 있고 사용자가 일부 방법을 정의할 수 있기 때문에 배열보다 유연합니다.
도움이 되시길 바랍니다:)
이러한 기능을 사용하는 또 다른 장점struct
타입 세이프티를 실시하는 것은, 그러한 타입 세이프티를struct
가 사용되고 있습니다.특히 같은 크기의 어레이로 구성된2종류의 어레이가 다른 용도로 사용되고 있는 경우, 이러한 타입을 사용하면 어레이가 잘못 사용되는 것을 방지할 수 있습니다.
어레이를 랩하지 않는 경우struct
, 아직 선언할 수 있습니다.typedef
그 이유: 이 기능은 다음과 같은 이점을 가지고 있습니다.struct
• 타입이 한번 선언되고, 사이즈가 자동적으로 올바르고, 코드의 의도가 명확해지고, • 코드가 보다 유지보수가 가능하지만, ① 엄격한 타입의 안전성, ③타입의 값을 복사 및 반환할 수 있는 기능, ③나중에 나머지 코드를 어기지 않고 멤버를 추가할 수 있는 기능이 없어집니다.두명typedef
특정 유형의 베어 어레이의 경우 크기가 다른 경우에만 다른 유형이 생성됩니다.또, 를 사용하고 있는 경우는,typedef
없이.*
함수 인수에서, 그것은 와 동등하다.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
언급URL : https://stackoverflow.com/questions/6966570/why-declare-a-struct-that-only-contains-an-array-in-c
'programing' 카테고리의 다른 글
개체가 인터페이스를 구현하는지 테스트합니다. (0) | 2022.08.24 |
---|---|
html.erb 템플릿의 v-model이 함수()를 렌더링함 ({ [value code] } ) (0) | 2022.08.24 |
어레이에서 구성 요소 삭제, vuejs에서 잘못된 구성 요소 제거 (0) | 2022.08.24 |
Vue에서 계산된 속성이 감시를 트리거하지 않습니다. (0) | 2022.08.24 |
FetchType을 가져오는 방법.스프링 컨트롤러에서 JPA 및 휴지 상태와의 LAGY 관련성 (0) | 2022.08.24 |