2017-03-16 14 views
0

私は基本的にメモリ割り当て、文字単位で文字列を作成するプログラムを作成しようとしていますが、キーボードからの入力は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]))"を同じ結果に試しました。

+0

あなたは 'free'を呼び出すことはありません。あなたのプログラムはメモリをリークし、メモリが足りなくなるため停止します。 – Dai

+0

@Dai reallocは既に割り当てられていたメモリを解放しているので、freeを呼び出す必要はありません。もしあなたが私がメインで無料で電話するべきだと言っているのであれば、あなたは正しいですが、このプログラムは決してメインには届かなかったので、それは問題ではありませんでした! –

+0

@ryyker私は分かりやすくするためにそれを認識しています(誰かが自分のコードを見て、私が "char"配列のためにメモリを割り当てていることを知っているでしょう) –

答えて

2

問題は、こので始まる:

string = malloc (sizeof (char)); 

ここstringは、実際のポインタへのポインタです。あなたはそれを間接参照する必要があります。

*string = malloc (sizeof (char)); 

その後、問題はあなたが間違ったことを逆参照

*(string[i]) = getchar(); 

を継続し、それはあなたが使用して他の場所と同じ

(*string)[i] = getchar(); 

する必要があります逆参照が間違っています。

あなたがすべてでポインタデリファレンスしません

そしてここで

string[i-1] = '\0'; 

(*string)[i-1] = '\0'; 

最後に、getchar機能がintを返すべきです。これは、結果をEOFと比較することによって、関数が失敗したかどうかをチェックするときに重要です。あなたはまったくこれをしない。

+0

大丈夫です。 getcharの部分の意味を理解できませんが、キーボードからスキャンするとEOFを検索する必要があるのはなぜですか?私は '\ n'のためにserachingするべきではないか?私はEOFも入力ストリームの終わりに機能することを理解していますが、この特定のケースでは、最初に改行文字に達することなくEOFに到達することはできません。 –

+0

@CarlosPintoシンボリック定数 'EOF'は' int'です。 'EOF!=(char)EOF'の可能性があります。そして、改行に関して、入力がファイルの終わりの前に改行なしのファイルからリダイレクトされたらどうしますか? –

関連する問題