2017-01-22 5 views
-1

次のCコードでは、1文字しか入力しないと、最後のprintfは "10,10"と表示されます。代わりに "10,8"が印刷されます。私が10バイトをmallocすると、なぜinputは8バイトしかありませんか?Cでのmalloc()の振る舞い

char* input; 
unsigned long inputLen = 10; 

input = (char*) malloc(10 * sizeof(char)); 

printf("Input: "); 
getline(&input,&inputLen,stdin); 
printf("%lu,%d",inputLen,sizeof(input)); 
+2

mallocをキャストするのは悪いです - http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+3

'sizeof(char)' - これは常に1である –

+1

'getline()'関数は、返された文字数を返します。あなたは入力がどれくらいの間であるかを知るために何かを使うのではなく、それを使うべきです。 'strlen()'を使うと、通常は同じ答えが得られますが、ユーザは入力ストリーム(Control- @通常)にヌルバイトを入れてから 'strlen()'を使うと短い答えが得られます。ユーザーが9文字以上(改行を含む)を入力すると、 'inputLen'の値はもっと大きくなることに注意してください。また、 'getline()'の第2引数は 'size_t *'でなければなりません。これは 'unsigned long'と必ずしも同じではありません。 –

答えて

5

sizeof(input) 8バイトポインタinputのサイズを返します。 C FAQ経由

Q:なぜsizeofは、メモリのブロックの大きさは、ポインタで指さ私に教えてくれありませんか?

A:sizeofは、ポインタのサイズを示します。 malloc 'edブロックのサイズを調べるポータブルな方法はありません。あなたがinputの容量を追跡したい場合は、別の変数を使用する必要があるとして、またはスタック上inputを宣言

sizeofは、コンパイル時に動作することも、覚えておいてください、ともquestion 7.27.を参照してください)配列のサイズを配列の個々の要素のサイズで割ります。容量を別々の変数として保存するほうが、ずっと簡単です。

0

inputchar*です。 NULLを終了する場合は、strlenの使用を検討する必要があります。

3

10バイトをmallocすると8バイトしか入力できません。

inputはポインタであり、ポインタはプラットフォーム上の8バイトです。 sizeof関数は、コンパイル時に決定された型のサイズを指示します。