グローバルにしたい配列があり、関数呼び出しで初期化したい。 私が最初にそれのサイズを知らなくても、それを宣言したい:C - 関数のグローバル配列を初期化する
char str[];
をし、後でそれを初期化します。
str = char[size];
私はこれをどのように行うことができますか? 私はCにはとても新しいので、ここで間違ったやり方をしているかもしれません。どんな助けでも大歓迎です。
グローバルにしたい配列があり、関数呼び出しで初期化したい。 私が最初にそれのサイズを知らなくても、それを宣言したい:C - 関数のグローバル配列を初期化する
char str[];
をし、後でそれを初期化します。
str = char[size];
私はこれをどのように行うことができますか? 私はCにはとても新しいので、ここで間違ったやり方をしているかもしれません。どんな助けでも大歓迎です。
これを行う方法は、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になります。
char* str;
str = (char*)malloc(size*sizeof(char));
sizeof(char) == 1
の定義から*sizeof(char)
をスキップできます。
はfree
一般的になりたいなら、型名を繰り返す必要はないので、 'sizeof(* str)'を使ってください。さらに、Cではmallocの結果をキャストすべきではありません。 –
Cでは、mallocの結果を実際にキャストするべきではありません。C++で行う必要があるのは、C言語では避けてください。 –
ではなく、配列のchar* str;
を作成して使用してメモリを解放することを忘れないでください。次に、mallocまたはcallocを使用して必要なメモリ量を割り当て、関数呼び出し自体で初期化を行います。
あなたのグローバル配列の宣言は次のようになりください:あなたは本当にmalloc関数の結果をキャストするべきではありませんCで
void init(int size)
{
...
str = malloc(size * sizeof(char));
...
}
'sizeof(char)'は定義上1です。任意の型で動作するコードを記述したい場合は、 'sizeof(* str)'を使用してください。 –
@Ben:trueですが、型に関係なく 'sizeof'をインクルードするのは良い習慣です。私は 'sizeof(* str) 'の議論をよく知っていますが、この場合は' sizeof(char) 'がもっと好きです。 –
- あなたはこのような何かを、あなたの初期化機能で次に
本当にC++で行う必要があります。それ以外の場合は有用な警告を隠すことができるため、Cでは避けるべきです。 –
もしあなたが一般的になりたいなら、 'sizeof(* str)'を使うと、型名を繰り返す必要はありません。さらに、Cではmallocの結果をキャストすべきではありません。 –
@Paul、@Ben:ありがとう、私はアンウォールを更新しました –