char가 표준으로 1이면 size of(char)이라고 쓰는 이유는 무엇입니까?
나는 C코딩을 하고 있었는데 C코드를 읽은 후에 다음과 같은 코드 조각이 있다는 것을 알았다.
char *foo = (char *)malloc(sizeof(char) * someDynamicAmount);
char 어레이에 메모리를 할당하는 C-ish 방법은 무엇입니까?사용하다sizeof(char)표준 변경에 대비하여 코드를 미래에도 사용할 수 있는지, 아니면 코드를 생략하고 직접 사용할 수 있는지 여부.
더 시쉬한 방법은
char* foo = malloc(someDynamicAmount * sizeof *foo);
유형이 아닌 변수를 참조하기 때문에 유형이 필요하지 않습니다.그리고 malloc(C++ish)의 결과를 캐스팅하지 않고.
그렇습니다.sizeof(char)의도를 명확히 하기 위해서요만약 누군가 결정을 내리면 그는 푸우가 되고 싶어 한다.int그는 그가 할 필요가 있다는 것을 안다.sizeof(int)계속 작동할 수 있도록 말이죠.
또는 생략하고 번호를 사용합니다.
게다가 매직 넘버를 사용하는 것은 좋은 코딩 연습이 아닙니다.
IMHO의 베스트 프랙티스는 글을 쓰는 것이다.sizeof(*foo)foo의 타입이 변경되어 사이즈가 수정되지 않은 경우에도 대상이 됩니다.
비교:
float*baz = malloc(sizeof(float) * someDynamicAmount);
int *bar = malloc(sizeof(int) * someDynamicAmount);
char *foo = malloc(sizeof(char) * someDynamicAmount);
비교:
float*baz = malloc(sizeof(float) * someDynamicAmount);
int *bar = malloc(sizeof(int) * someDynamicAmount);
char *foo = malloc(someDynamicAmount);
저는 첫 번째 버전이 좋아요.두 번째가 더 좋아요?
네 말이 맞아, 표준적으로는 곱셈은 상관성이 없어.그렇긴 하지만, 누군가 일관성을 유지하기 위해 버릇을 들인 것 같다.항상 를 사용하는 경우sizeof()타입에 관계없이, 당신은 절대 잊지 않을 것입니다.
char *foo = (char *)malloc(sizeof(char) * someDynamicAmount);
int *bar = (int *)malloc(sizeof(int) * someDynamicAmount);
일반적인 관용구는
T *p = malloc(N * sizeof *p);
또는
T *p;
...
p = malloc(N * sizeof *p);
이렇게 하면 종류에 대해 걱정할 필요가 없습니다.
C99 표준, 섹션 6.5.3.4 운영자는 다음을 인용한다.
type char, unsigned char 또는 signed char 또는 signed char(또는 그 수식 버전)를 가진 오퍼랜드에 적용하면 결과는 1이 됩니다.배열 유형을 가진 오퍼랜드에 적용하면 배열의 총 바이트 수가 됩니다.구조체 또는 유니언 타입을 가진 오퍼랜드에 적용하면 내부 패딩과 후행 패딩을 포함한 이러한 오브젝트 내의 총 바이트 수가 됩니다.
그것은,sizeof char == 1구현이 아닌 표준으로 구현해야 합니다.따라서 생략하는 것은 전적으로 옳다.sizeof(char)전화할 때malloc()같은 경우에 사용할 수 있습니다.IMHO, 미래의 C 표준이 구현 고유의 크기를 허용할 가능성은 매우 낮습니다.charC에서는 이미 너무 많은 코드가 1에 의존하고 있기 때문에 하위 호환성이 매우 중요합니다.
따라서 이 질문은 정확성이 아니라 스타일에 관한 것일 뿐이며, 저는 Aprogrammer의 답변을 지지합니다.
쓰기sizeof(char)는, 표준의 변경에 대해서, 코드를 「미래에 대비하는」 것이 아닙니다.그건 보통 어떤 것에 대한 완전한 오해의 표시이다.sizeofC에서 메모리 객체의 전체 기본 모델 - C 표준 언어로 유형 표현이라고 하는 것.a의 유일한 이유는sizeof연산자는 심지어 존재하거나 말이 되는 것은 C가 가능한 최소 단위의 관점에서 메모리에 "표현"을 갖는 객체를 지정하기 때문이다.unsigned char이 기능이 없다면 스토리지는 훨씬 더 추상적이기 때문에sizeof그리고 관련 포인터 산술.
sizeof의 단위로 정의됩니다. char,예.sizeof(T)==N평균 유형T점유.N chars. 이 점에 비추어 볼 때,sizeof(char)완전히 바보같다; 그것은 얼마나 많은 사람들이 그들의 삶을chars a.char점유하고 있다.
이것은 모두 코딩 스타일의 문제입니다.몇 가지 스타일이 있습니다.
실제로 질문에 답하기 위해 사람들은 다음과 같이 씁니다.
malloc(n * sizeof(char))
사용하는 모든 코드를 유지할 수 있습니다.malloc일관된.다음 번에는 필요할 수도 있습니다.int똑같은 방식으로 코드를 작성할 수 있어요
malloc(n * sizeof(int))
그래서 코딩 스타일을 일관되게 유지하기 위해서 하는 것입니다.그럼에도 불구하고.sizeof(char)는 실제로 항상 1임을 보증하기 때문에 불필요한 것입니다.자기 문서 코드를 작성하는 방법입니다.
단, C에서 malloc을 사용하는 가장 일반적인 방법은 아마도
type* t = malloc(n * sizeof(*t));
또는 100% 동등:
type* t = malloc(n * sizeof *t);
since 、 since 、 since 、 since 。sizeof 평가되지 코드는 없습니다.을 사용하다변수가t이치노
세 번째 가능한 스타일은 어레이 포인터를 사용하는 올바른 스타일입니다.실제로 할당하는 것은 어레이이기 때문입니다.
type (*t)[n] = malloc( sizeof(type[n]) );
타입의 정확성에 관한 한 이것이 가장 올바른 방법일 것입니다.어레이의 크기가 할당되고 할당된 어레이를 어레이 포인터로 가리킵니다.
이 만든다는 이은 ", " "로 참조 해야 합니다.(*t)[i]t[i]코드 판독이 어려워집니다.(또한 n이 정수 상수식이 아닌 경우 오래된 오래된 C 컴파일러에서는 코드가 컴파일되지 않습니다.)
코딩 스타일은 다음과 같이 쓸 수도 있습니다.
char *foo = (char *)malloc(1 * someDynamicAmount);
그러나 이것은 동적으로 할당되는 메모리를 원하는 기본 데이터 유형의 번호에 따라 늘릴 수 있도록 하기 위한 것입니다. 100자를 늘리려면 100자를 늘립니다.필요하지 않을 수도 있지만 101이나 102라고 쓰면 메모리가 낭비됩니다.기본 데이터 타입에 따라 하면 메모리 공간이 낭비되지 않습니다.
그 기준은 일반적인 유형의 크기에 대해 의도적으로 모호하다.[Wikipedia]
「」, 「」의가 「1」이라고 하는 만,char는 변하지 않습니다.short 가 변했습니다.관용적인 방법은 다음과 같습니다.
type_t *foo = malloc(sizeof(type_t) * someDynamicAmount);
모든 유형(공통 또는 복합)에 대해 type_t 또는
type_t *foo = malloc(sizeof(*foo) * someDynamicAmount);
나중에 foo 유형을 변경하고 한 곳에서만 변경할 수 있습니다.
유니코드 및 멀티바이트 문자열을 생각해 보십시오.char가 문자열 내의 단일 문자를 나타내는 경우 실제로는 1바이트 이상을 차지할 수 있으므로 sizeof()> 1이 됩니다.
언급URL : https://stackoverflow.com/questions/7243872/why-write-sizeofchar-if-char-is-1-by-standard
'source' 카테고리의 다른 글
| C/C++, 문자열 리터럴에 #파일을 포함할 수 있습니까? (0) | 2022.08.08 |
|---|---|
| Vue.js 데이터 인스턴스 내의 cytoscape 객체를 어떻게 저장합니까? (0) | 2022.08.08 |
| 주체, 사용자 및 주체 간의 의미와 차이점은 무엇입니까? (0) | 2022.08.07 |
| vue 2와 함께 작동하도록 진행 표시줄 가져오기 (0) | 2022.08.07 |
| Vuejs : vue-devtools에서 Vue 인스턴스의 이름을 지정할 수 있습니까? (0) | 2022.08.07 |