2012-01-09 17 views
-2

私は、cでreadシステムコールを使用して読み込まれる動的に割り当てられた文字列の配列を保持しようとしています。ここで私が何をしようとしています何の小さなサンプルです:calloc/mallocと奇妙な動作を読んでいますか?

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

void processInput() { 
    char ** array = (char **) calloc(20, sizeof(char*)); 
    int arrayIndex = 0; 
    while(1) { 
     printf("Type something: "); 
     fflush(stdout); 

     char* buffer; 
     int readResult = read(0, buffer, 100); 

     array[arrayIndex] = (char*)calloc(readResult, sizeof(char)); 
    } 
}  

はしかし、これはいくつかの奇妙な問題が発生します。

 

    Type something: a 
    Type something: Type something: a 
    Type something: Type something: abcdefg 
    Type something: Type something: Type something: Type something: Type something: Type something: Type something: Type something: 

は、このために任意の説明がありますか?なぜこれが起こっているのか分かりません。

+3

'char * buffer; readResult = read(0、buffer、100); '初期化されていない変数、特に初期化されていないポインタの使用は、涙で終わることがあります。 –

+1

あなたは 'arrayIndex'をインクリメントしていません – Kevin

+0

申し訳ありませんが、この例はやや厄介でした。あなたはarrayIndexをインクリメントしていないということは間違いありませんが、この例では重要ではありませんでした。しかし実際には、arrayIndexをインクリメントする必要があることを100%修正しています。それ以外の場合は、索引0:Pに最後に追加された項目以外の項目は格納されません。 – Ryan

答えて

2

置き換えますと

char *buffer; 

char buffer[100]; 

を寸法はread()への引数と一致しているが、あなたの文字列がnull read()によって終了されることはありませんので、あなたは101を割り当てることを好むかもしれませんバイトを強制的にヌルにして終了します。スペースを割り当てるときに余分なバイトについて考える必要があります。

割り当てられた領域は使用されないことに注意してください。

メモリ割り当てを使用する前に、常にエラーをチェックしてください。

ループの前に20個のポインタしか割り当てられないため、while (1)ループは危険で、ユーザが20行以上のデータを入力すると、割り当てられた領域を十分に超えてしまいます。

(ユーザーがファイルからの入力をリダイレクトすると、20行を読み上げることはないことに注意してください.20文字の100文字、改行、すべてのブロックを読み込み、クラッシュ領域に入ります。 )

0

出力を見ると、入力内の各文字のループを実行しているように見えます。