2010-11-21 7 views
6

グローバルにしたい配列があり、関数呼び出しで初期化したい。 私が最初にそれのサイズを知らなくても、それを宣言したい:C - 関数のグローバル配列を初期化する

char str[]; 

をし、後でそれを初期化します。

str = char[size]; 

私はこれをどのように行うことができますか? 私はCにはとても新しいので、ここで間違ったやり方をしているかもしれません。どんな助けでも大歓迎です。

答えて

7

これを行う方法は、mallocです。あなたはinit関数で、それを

char *str; 

malloc:最初だけポインタを宣言

str = malloc(sizeof(*str) * size_of_array); 

これはサイズのsize_of_array要素(この場合はchar)へstrポイントそれを割り当てます。割り当てが失敗した場合

あなたがチェックする必要があります:

if (str == NULL) { 
    // allocation failed 
    // handle the error 
} 

は通常、あなたはあなたがそれで終わったら必ず freeこの割り当てられたメモリを確認する必要があります。しかし、この場合、 strはグローバルであるため、範囲外になることはありません。プログラムが終了するとメモリは free dになります。

+4

- あなたはこのような何かを、あなたの初期化機能で次に

char *str = NULL; 

本当にC++で行う必要があります。それ以外の場合は有用な警告を隠すことができるため、Cでは避けるべきです。 –

+2

もしあなたが一般的になりたいなら、 'sizeof(* str)'を使うと、型名を繰り返す必要はありません。さらに、Cではmallocの結果をキャストすべきではありません。 –

+2

@Paul、@Ben:ありがとう、私はアンウォールを更新しました –

1
char* str; 

str = (char*)malloc(size*sizeof(char)); 

sizeof(char) == 1の定義から*sizeof(char)をスキップできます。

free

+2

一般的になりたいなら、型名を繰り返す必要はないので、 'sizeof(* str)'を使ってください。さらに、Cではmallocの結果をキャストすべきではありません。 –

+1

Cでは、mallocの結果を実際にキャストするべきではありません。C++で行う必要があるのは、C言語では避けてください。 –

1

ではなく、配列のchar* str;を作成して使用してメモリを解放することを忘れないでください。次に、mallocまたはcallocを使用して必要なメモリ量を割り当て、関数呼び出し自体で初期化を行います。

2

あなたのグローバル配列の宣言は次のようになりください:あなたは本当にmalloc関数の結果をキャストするべきではありませんCで

void init(int size) 
{ 
    ... 
    str = malloc(size * sizeof(char)); 
    ... 
} 
+1

'sizeof(char)'は定義上1です。任意の型で動作するコードを記述したい場合は、 'sizeof(* str)'を使用してください。 –

+0

@Ben:trueですが、型に関係なく 'sizeof'をインクルードするのは良い習慣です。私は 'sizeof(* str) 'の議論をよく知っていますが、この場合は' sizeof(char) 'がもっと好きです。 –