メモリの動的割付け、あるいはオブジェクトの動的生成の方法は、C++(C++98)とC99では大きく異なります。
newおよびdelete演算子はない
C++では、オブジェクトの動的生成と解体に使っていたnew演算子とdelete演算子はC99にはありません。代わりに、malloc関数とfree関数を使います。また、必要に応じて、calloc関数やrealloc関数を使うこともできます。C99では、動的割付けはライブラリの機能であり、言語レベルの機能ではありません。
可変長配列
C99では可変長配列(VLA)を使うことができます。通常、配列の要素数には定数式しか指定することができませんが、関数原型有効範囲またはブロック有効範囲では、配列の要素数に定数式以外を指定することができます。結果として、実行時に要素数が決まる配列を定義できるようになっています。
|
0 1 2 3 4 5 6 |
int foo(int n) { int array[n]; ... } |
非標準関数として、allocaのような関数をサポートしている処理系は少なくありません。C99の可変長配列は、そうしたallocaと同様の使い方ができますが、よりシンプルな記法が使える分、優れているといえます。
また、関数原型有効範囲に可変長配列を指定する場合には、通常、次のように要素数と一緒に渡すことになります。
|
0 1 2 3 4 5 |
int bar(int n, int a[n]) { ... } |
関数の(定義ではなく)宣言を行う場合には、次のように可変長配列の要素数を省略することもできます。
|
0 1 2 |
int bar(int n, int a[*]); |
可変長配列であっても、sizeof演算子を使ってサイズを取得することができます。ただし、sizeofの式は実行時でなければ評価できないため、定数式になりません。

![[C11] 第2回 オブジェクトの宣言](https://www.kijineko.co.jp/wp-content/uploads/2021/10/22351681_s.jpg)

![[C99] 第4回 (欠番)](https://www.kijineko.co.jp/wp-content/themes/keni8-child/images/no-image.jpg)
![[C11] 第5回 型と型変換](https://www.kijineko.co.jp/wp-content/uploads/2021/10/22519472_s.jpg)
![[C99] 第12回 標準Cライブラリ](https://www.kijineko.co.jp/wp-content/uploads/2021/10/22405104_s.jpg)
![[C99] 第13回 フリースタンディング環境](https://www.kijineko.co.jp/wp-content/uploads/2021/09/3469684_s.jpg)