私は基本的にメモリ割り当て、文字単位で文字列を作成するプログラムを作成しようとしていますが、キーボードからの入力は1つだけです。私はそれを行うための複数の(より良い)方法があることを知っていますが、私はこの特定の方法でそれをやりたかったのです! は、ここでは、コードです:mallocとgetchar()で文字列を作成する
int newstring (char** string)
{
printf("--------------In function newstring--------------\n");
int i = 0;
string = malloc (sizeof (char));
printf("Adress: %p\n", (void*)string);
if (string == NULL)
return -1;
while (1)
{
printf("Pre-scan\n");
*(string[i]) = getchar();
printf("After-scan\nstring[%d] = %c\n", i, *(string[i]));
i++;
if (*(string[i-1]) == '\n')
break;
printf("Reallocation to size %d\n", i+1);
string = realloc (string, sizeof (char) * (i+1));
if (string == NULL)
return -1;
}
string[i-1] = '\0';
printf("--------------Exit function newstring--------------\n");
return;
}
int main()
{
char *string;
newstring (&string);
printf("%s\n", string);
}
問題は、プログラムが常に3文字目を読み取る前に途中でクラッシュしたということです、ここで発生したprintfを以下のとおりです。
Adress: 00AE1578
Pre-scan
1st Input: >>Hello
After-scan
string[0] = H
Reallocation to size 2
Pre-scan
After-scan
string[1] = e
Reallocation to size 3
Pre-scan
私はそれが理由でだのか疑問に思ってきましたがバッファには何らかの制限がありますが、制限が2文字であるとは思えません(複数の入力を試してみましたが、常に3文字前に止まってしまいます)。また、 "scanf("%c "、*(string [i]))"を同じ結果に試しました。
あなたは 'free'を呼び出すことはありません。あなたのプログラムはメモリをリークし、メモリが足りなくなるため停止します。 – Dai
@Dai reallocは既に割り当てられていたメモリを解放しているので、freeを呼び出す必要はありません。もしあなたが私がメインで無料で電話するべきだと言っているのであれば、あなたは正しいですが、このプログラムは決してメインには届かなかったので、それは問題ではありませんでした! –
@ryyker私は分かりやすくするためにそれを認識しています(誰かが自分のコードを見て、私が "char"配列のためにメモリを割り当てていることを知っているでしょう) –