2011-08-12 17 views
2

私は新しいです。 C言語で文字配列(または文字列)に関する質問をしてください:C言語で文字配列を作成するときに、同時にサイズを指定する必要がありますか?Cの文字配列

実際に必要なサイズがわからないことがあるためです。例えば、クライアント/サーバプログラムの場合、サーバプログラムがクライアントプログラムからメッセージを受け取るための文字配列を宣言したいが、メッセージのサイズがわからない場合は、

char buffer[1000]; 
recv(fd,buffer, 1000, 0); 

実際のメッセージの長さが10の場合はどうなりますか。そのために多くのメモリが浪費されますか?

+0

「Cでの動的メモリ割り当て」 –

+0

を検索してください。事前に予約する必要があるので、eあなたの実際のケースではうまくいくはずですが、まだ実際にもっと必要なことを認識しています。 –

+0

文字配列を使用せずに文字列型を組み込んだC++では、このproblenはありません。もちろん、さまざまな問題があるかもしれませんが、多分あなたは一見する必要があります。 – john

答えて

2

はい、mallocを使用していても、事前にディメンションを決定する必要があります。

この例のように、ソケットから読み取るときは、通常、適度なサイズのバッファを使用し、すぐに他の構造体にデータをディスパッチします。いずれにしても、1000バイトはそれほどメモリが無駄ではなく、あるメモリマネージャから一度にバイトを要求するよりもはるかに高速です:)

1

はい、チャンクを初期化していない場合はサイズを指定する必要があります宣言時の配列。より良いアプローチは、実行時に最適なバッファサイズを特定し、メモリを動的に割り当てることです。

0

あなたが求めているのは、バッファを動的にサイズ変更する方法です。これは、malloc() - メモリアロケータを使用するなどの動的割り当てで行われます。バッファを使用し終わったらをシステムに戻す必要があります。 malloc()[またはcalloc()]を使用している場合は、free()を返します。例えば

char *buffer; // pointer to a buffer -- essentially an unsized array 
buffer = (char *)malloc(size); 
// use the buffer ... 
free(buffer); // return the buffer -- do NOT use it any more! 

解決するために残された唯一の問題はあなたが必要とするサイズを決定する方法です。あなたがサイズでヒントしているデータをrecv()しているならば、2つのrecv()呼び出しに通信を分割する必要があります:最初にすべてのパケットが持つ最小サイズを取得し、フルバッファを割り当て、残りの部分を採取する。次のようにあなたは、入力データの正確な量を知っていない

0

  1. は、「ストレージ」のためにいくつかのメモリを割り当て、小さなバッファ
  2. を作成します(例えば二回バッファサイズの)
  3. ENOがない場合
  4. (例えばソケット、ファイル等)ストレージ

    4.1へのバッファから

  5. コピーデータ入力ストリームからのデータを使ってバッファを埋めます記憶装置内の場所を変更し、メモリを再割り当てする。 「ストリームの終わり」は

    あなたのストレージが今のデータが含まれていない限り、それはこの時点である2倍大きいサイズ)で

  6. Doが手順3と4。

0

あなたのサイズに事前に知っていない場合は、malloc関数(または選択した言語で同等のどんなメカニズムを使用して動的に作成するしかありません。)

size_t buffer_size = ...; /* read from a DEFINE or from a config file */ 
char * buffer = malloc(sizeof(char) * (buffer_size + 1)); 

サイズmのバッファを作成するが、唯一のn < mとサイズnの入力文字列を受け取るには、メモリの無駄はなく、エンジニアリングの妥協はありません。

目的の入力に近いサイズのバッファを作成した場合は、バッファを多くの場合、多くの場合、m >> nの場合はリフィルする必要があります。通常、バッファーの反復はI/O操作と結びついているので、いくつかのバイト(今日のハードウェアでは実際には何もありません)を保存して、別の目的で問題を潜在的に増加させることはありません。特にクライアント/サーバーアプリ向けです。リソースが制約されている組み込みシステムについて話していたら、それは別のことです。

あなたのアルゴリズムを正しいものにすることを心配する必要があります。そうすれば、ここで2,3バイトを削ることについて心配しています。

私にとっては、入力が標準偏差が遅い傾向があると仮定して、平均入力よりも2〜10倍大きいバッファを作成したいと思います(あなたの場合のように最小の入力ではなく平均です)サイズで。そうでなければ、私は20倍以上のサイズ(特にメモリが安い場合にこれを行うとディスクやNICカードに当たるのを最小限に抑えます)。 (または引き数として渡される)構成項目、および何も指定されていない場合はデフォルトでに設定されます。次に、観測された入力サイズに従ってバッファのサイズを調整することができます。

さらに複雑なアルゴリズム(TCPなど)は、実行時にバッファのサイズを調整して、時間の経過とともにサイズが変わる可能性のある入力をより適切に調整します。

0

mallocを使用した場合でも、最初にサイズを定義する必要があります。あなたが使用されていない場所を解放するか、未使用の場所

example: 
int main() 
{ 
char *str; 

    /* Initial memory allocation */ 
    str = (char *) malloc(15); 
    strcpy(str, "tutorialspoint"); 
    printf("String = %s, Address = %u\n", str, str); 

    /* Reallocating memory */ 
    str = (char *) realloc(str, 25); 
    strcat(str, ".com"); 
    printf("String = %s, Address = %u\n", str, str); 

    free(str); 

    return(0); 
} 
を占有するためにそれを再割り当てすることができ、小さなメッセージや大型の場合

int buffer[2000]; 

:ので、代わりに次のようなメッセージを受け入れることができる多数を与えます

注:stdlib.hライブラリを必ず含めてください