2012-02-25 10 views
2

通常のmallocはsizeofが含まれていますが、この1つはないと私は代わりに、+ 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)が標準で定義されているため、sizeof(char)が常にとなり、常に1になり、1を乗算するともう一方のオペランドが生成されるため、必要な要素の数を増やす必要はありません。

+ 1は、NULターミネータのためのスペースを確保することです。長さが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を割り当てる必要があります。 charを割り当てると、sizeof(char)は1ですので、実際には1 * (i + 1)を割り当てる必要がありますが、それは同じです。

関連する問題