2012-02-25 2 views
2

는 보통의 malloc은 sizeof 포함되어 있지만이 하나하지 않습니다 및이 나는 + 1 대신 :왜이 C 코드에서 malloc i + 1에 대한 인수가 있습니까?

int main() 
{ 
    int i,n; 
    char * buffer; 

    printf ("How long do you want the string? "); 
    scanf ("%d", &i); 

    buffer = (char*) malloc (i+1); 
    if (buffer==NULL) exit (1); 
+1

'malloc'의 리턴 값을 실제로 던져서는 안됩니다. –

답변

10

당신은 어떤 유형의 배열을 할당하고 싶다면, 당신은 일반적으로 당신이 원하고있는 요소의 수를 곱 것 malloc은 배열의 크기가 바이트이되므로 해당 유형의 크기입니다.

그러나 char의 배열은 특별한 경우입니다. sizeof(char)이 표준에 의해 정의되어 으로 항상이되고 1이되기 때문에 원하는 요소의 수를 곱할 필요가 없으며 1을 곱하면 다른 피연산자가 산출됩니다.

+ 1NUL 터미네이터의 공간을 확보하는 것입니다. 길이가 n 인 문자열을 원하면 배열의 길이는 n + 1이어야합니다. 문자열의 n 문자의 경우 n 공백이고 종료 문자의 경우는 1 공백입니다.

한편, 반환 값은 malloc입니다. 나중에 코드를 변경하기가 쉽습니다. 문자열에 대한 할당하는 당신이 문자열의 끝을 의미 널 문자 + 1 추가 문자의 수에 대한 충분한 메모리가 필요한 경우

+2

이제 char은 1 바이트이고 +1은 NULL입니다. 대단히 감사합니다! – Coffee

+0

Byte * packData = (Byte *) calloc (byteLen, sizeof (Byte)); 이 코드는 byteLen + 1이 필요합니까? – SenKe

3

C 문자열이 null 종료하고, 참조 :

예 "abc"는 "abc"+ NUL로 표시됩니다. 따라서 길이가 i 인 문자열의 경우 i + 1을 할당해야합니다. 문자를 할당 할 때 sizeof (char)는 1이므로 실제적으로 1 * (i + 1)을 할당해야하지만 동일합니다.