文字列に動的にメモリを割り当てようとしましたが、サイズを出力するときに割り当てられる(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
'sizeof(string)'の代わりに 'strlen(string)'を使用します。後者は、*ポインタをchar *に保持するために必要なメモリを与えます。また、 'strlen'か' sizeof'で返された数字の正しい書式指定子は '%zu'です。 –
いくつかのことがあります:最初に['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に、最後の文字をターミネータで上書きします。 –
バグ: 'string [i] = '\ 0';'しかし 'string + i'は存在しません(割り当てられた記憶領域はありません)。 –