2009-09-28 2 views
3

나는 수년 동안 사용 해왔다. 즉,sizeof (type [1234])를 사용하는 데 문제가 있습니까?

text = (char *)malloc(sizeof(char[1234])); 

대신

text = (char *)malloc(sizeof(char) * 1234); 

사람들은 위험하다고 말했지만 아무도 이유를 말할 수 없었다. 나는 C 스펙을 검사했고 그것은 합법적이다. 여기에 함정이 있습니까?

+0

'는 sizeof (문자)하지 않습니다'표준에 의해 보장은 할 수 하나, 그래서 난 그냥'malloc (1234);'하고 그것을 함께 얻을. 그러나 다른 유형의 경우, 나는 순수하게 미적 이유로 두 번째 것을 선호합니다. –

답변

7

합법적 일 수 있지만 몇 가지 함정이 있습니다.

(또는 나중에 테이너가) 무조건 식으로 유형을 대체 할 경우

먼저해야 문제 :

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 

마지막으로 매우 일반적인 관용어는 아니므로 코드를 읽는 사용자는 잠시 혼란 스러울 수 있습니다. 이 함정은 당신의 습관을 변경하는 노력이 가치가 있도록 여부

물론 :), 당신에게 달려있다

3

그것은 합법적이며, 그것을 당신이 말한 방법을 수행하는 것이 안전합니다 :

text = (char *)malloc(sizeof(char[1234])); 

일반적으로 사람들은 가장 작은 가장 원시적 인 데이터 유형으로 sizeof로 작업하지만 카운트에서 패딩을 포함하여 과거에 도달해야합니다.

누군가가 배열이 요소 사이에 패딩을 가질 수 있다고 생각하여 안전하지 않다고 들었을 것입니다.

그러나 배열의 요소 사이에는 절대 패딩이 없습니다. C99 표준은 배열이 메모리의 연속적인 부분이어야한다고 말합니다.

하지만 C.

의 구조체
3

내가 대신 유형의 변수를 사용하여 좋을 걸 내에서 배열 당신은 이전 또는 이후에 패딩을 가질 수 있습니다

text = malloc(sizeof(*text)*1234));

이 방법은 당신이하고자 실현하는 경우 국제화를 지원하기 위해 좋은, 그리고에서 정의를 변경 :

char *text;

에 :

wchar_t *text;

1234 개 요소에 대한 충분한 공간을 얻으려면 모든 할당을 'char'에서 'wchar_t'로 변경하여 수정하지 않아도됩니다. 물론, 같은 다른 유형에 적용 - 긴 대 짧은 대를 INT, 등 대 더블

4

을 떠 내가 사용하는 관용구는 다음과 같습니다

나에게
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 */ 
+1

나는 이론에있어 (그리고 Jerry Coffin) 당신의 의견에 동의한다. 그러나 그것은 내가 결코 들어 본 적이없는 습관이다. –

+0

+1과 괄호를 올바르게 사용하려면 One True sizeof Usage를 사용하십시오. – unwind

0

해야한다. 첫 번째 버전에서 객체의 수는 컴파일 타임 상수 여야합니다. 두 번째 버전에서는 런타임에 요소 수를 결정할 수 있습니다.

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 
} 
관련 문제