나는 수년 동안 사용 해왔다. 즉,sizeof (type [1234])를 사용하는 데 문제가 있습니까?
text = (char *)malloc(sizeof(char[1234]));
대신
text = (char *)malloc(sizeof(char) * 1234);
사람들은 위험하다고 말했지만 아무도 이유를 말할 수 없었다. 나는 C 스펙을 검사했고 그것은 합법적이다. 여기에 함정이 있습니까?
나는 수년 동안 사용 해왔다. 즉,sizeof (type [1234])를 사용하는 데 문제가 있습니까?
text = (char *)malloc(sizeof(char[1234]));
대신
text = (char *)malloc(sizeof(char) * 1234);
사람들은 위험하다고 말했지만 아무도 이유를 말할 수 없었다. 나는 C 스펙을 검사했고 그것은 합법적이다. 여기에 함정이 있습니까?
합법적 일 수 있지만 몇 가지 함정이 있습니다.
(또는 나중에 테이너가) 무조건 식으로 유형을 대체 할 경우먼저해야 문제 :
sizeof(char *) * 4 => sizeof(x) * 4 // OK
sizeof(char *[4]) => sizeof(x[4]) // NOT OK
둘째, 모든 컴파일러가 지원할 수 가변 길이 배열 :
sizeof(char *) * n // ALWAYS SUPPORTED
sizeof(char *[n]) // MAY NOT BE SUPPORTED
마지막으로 매우 일반적인 관용어는 아니므로 코드를 읽는 사용자는 잠시 혼란 스러울 수 있습니다. 이 함정은 당신의 습관을 변경하는 노력이 가치가 있도록 여부
물론 :), 당신에게 달려있다
그것은 합법적이며, 그것을 당신이 말한 방법을 수행하는 것이 안전합니다 :
text = (char *)malloc(sizeof(char[1234]));
을
일반적으로 사람들은 가장 작은 가장 원시적 인 데이터 유형으로 sizeof로 작업하지만 카운트에서 패딩을 포함하여 과거에 도달해야합니다.
누군가가 배열이 요소 사이에 패딩을 가질 수 있다고 생각하여 안전하지 않다고 들었을 것입니다.
그러나 배열의 요소 사이에는 절대 패딩이 없습니다. C99 표준은 배열이 메모리의 연속적인 부분이어야한다고 말합니다.
하지만 C.
의 구조체내가 대신 유형의 변수를 사용하여 좋을 걸 내에서 배열 당신은 이전 또는 이후에 패딩을 가질 수 있습니다
text = malloc(sizeof(*text)*1234));
이 방법은 당신이하고자 실현하는 경우 국제화를 지원하기 위해 좋은, 그리고에서 정의를 변경 :
char *text;
에 :
wchar_t *text;
1234 개 요소에 대한 충분한 공간을 얻으려면 모든 할당을 'char'에서 'wchar_t'로 변경하여 수정하지 않아도됩니다. 물론, 같은 다른 유형에 적용 - 긴 대 짧은 대를 INT, 등 대 더블
을 떠 내가 사용하는 관용구는 다음과 같습니다
나에게someptr = malloc(number_elems * sizeof *someptr);
, 이것은 장점이있다 요소의 유형을 변경해야한다면 malloc 호출에 대해 걱정할 필요가 없습니다.
int *data;
data = malloc(100 * sizeof *data);
...나중에 내가 실현 데이터는 둘 사이에 실질적인 차이가 있습니다 unsigned long
의 ...
unsigned long *data;
data = malloc(100 * sizeof *data); /* no change from previous version */
나는 이론에있어 (그리고 Jerry Coffin) 당신의 의견에 동의한다. 그러나 그것은 내가 결코 들어 본 적이없는 습관이다. –
+1과 괄호를 올바르게 사용하려면 One True sizeof Usage를 사용하십시오. – unwind
해야한다. 첫 번째 버전에서 객체의 수는 컴파일 타임 상수 여야합니다. 두 번째 버전에서는 런타임에 요소 수를 결정할 수 있습니다.
size_t x = sizeof(double[99]);
size_t y = sizeof(double)*99;
작업 모두 예상대로 동안
그래서, 다음의 예는이 특별한 경우
void fun(int i) {
size_t x = sizeof(double[i]); // error, no compile-time constant
size_t y = sizeof(double) * i; // Fine
}
'는 sizeof (문자)하지 않습니다'표준에 의해 보장은 할 수 하나, 그래서 난 그냥'malloc (1234);'하고 그것을 함께 얻을. 그러나 다른 유형의 경우, 나는 순수하게 미적 이유로 두 번째 것을 선호합니다. –