2017-02-26 5 views
-5

文字列に動的にメモリを割り当てようとしましたが、サイズを出力するときに割り当てられる(11 + 1)バイトの代わりに4バイトが表示されます。なぜこれが起こるのですか?文字列がうまく印刷されます。文字列への動的メモリ割り当てが不正なサイズを返す

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main(){ 
char c, *string; 
int i=0, a=1; 

printf("\nEnter the string : "); 

string = (char *) malloc (sizeof(char)); 
while(c != '\n'){ 
    c = getchar(); 

    string = (char *) realloc (string, sizeof(char) * a); 

    string[i] = c; 

    a++, i++; 
} 
string[i] = '\0'; 

puts(string); 

printf("\n%d", sizeof(string)); 

} 

Input : Sample Text 
Output : 
    Sample Text 
    4 
+2

'sizeof(string)'の代わりに 'strlen(string)'を使用します。後者は、*ポインタをchar *に保持するために必要なメモリを与えます。また、 'strlen'か' sizeof'で返された数字の正しい書式指定子は '%zu'です。 –

+1

いくつかのことがあります:最初に['malloc'(およびfriends)のキャストに関するこのディスカッション](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)をお読みください。第2に、['realloc'](http://en.cppreference.com/w/c/memory/realloc)を使用するときに関数に渡すポインタに直接戻さないでください。[' realloc' realloc'](http://en.cppreference.com/w/c/memory/realloc)はヌルポインタを返します。第三に、ターミネータのためのスペースを割り当てない。第4に、最後の文字をターミネータで上書きします。 –

+0

バグ: 'string [i] = '\ 0';'しかし 'string + i'は存在しません(割り当てられた記憶領域はありません)。 –

答えて

0

sizeofは、あなたのプラットフォームで4のcharポインタのサイズを与えています。

0

sizeof演算子は、変数の「サイズ」を返します。この場合はポインタです。 32ビットシステムでは、ポインタは4バイトなので、これは何が印刷されます。 strlen(char*)関数を使用すると、ポインタが移動する文字列を含むメモリが検索されます。この関数は、終端バイトの最後のバイトが何バイトになるかを数えます。0

関連する問題