C と C++ の両方で配列という用語は、同じ型の 1 つ以上のデータ要素を含む連続したメモリ ブロックを表すために使用されます。
配列には、静的配列と動的配列の 2 種類があります。静的配列は、プログラムがコンパイルされ、プログラムのデータ セグメントに格納されるときにメモリに割り当てられます。動的配列は、その名前が示すように、実行時にヒープ (プログラムが動的割り当てのために使用できるメモリにアクセスするために使用されるデータ構造) から割り当てられます。
両方の配列型は、ポインターとインデクサー ([] 演算子) を使用して同じ方法でアクセスされます。
C と C++ の両方で、ポインターはメモリ内の場所を指す変数です。それが指すメモリには、クラスまたはプリミティブ データ型が含まれる場合があります。
ただし、静的配列と動的配列には違いがあります。重要なものは次のとおりです。
- 動的配列は、それらを使用するために割り当て、メモリリークを防ぐために解放する必要があります
- 静的配列はサイズ変更できません
C では、 を使用してメモリを割り当て、 を使用malloc
して解放しfree
ます。を使用してサイズを変更できますrealloc
C++ では、 を使用してメモリを割り当て、 を使用new
して解放しdelete
ます。サイズを変更するには、独自のコードを記述する必要があります。
ほとんどの場合、C++ の動的配列は を使用して実装されstd::vector
ます。C では、そのようなメカニズムが必要な場合は、独自に作成する必要があります。@Cheers と hthから良い回答がありました。std::vector
-アルフオン。
ここは、C または C++ での動的メモリに関する完全なチュートリアルを書く場所ではないと思います。http://www.cplusplus.com/doc/tutorial/dynamic/から良い紹介を得ることができます
ただし、C で必要なことを行う方法を示すサンプル コードを次に示します。C++ の場合は、std::vector
.
/*
C CODE
*/
#include <stdlib.h>
#include <limits.h>
typedef struct DARRAY dynamic_int_array_t;
typedef struct DARRAY
{
int length;
int *data;
void (*alloc)(dynamic_int_array_t * the_array, int length);/*allocate*/
void (*free)(dynamic_int_array_t * the_array);/*free*/
void (*resize)(dynamic_int_array_t * the_array, int new_length);/*resize*/
void (*append)(dynamic_int_array_t * the_array, int new_value);
int (*get_at)(dynamic_int_array_t * the_array, int pos);/*use 1 based index getter*/
void (*set_at)(dynamic_int_array_t * the_array, int pos, int value);/*use 1 based index setter*/
}dynamic_int_array_t;
void allocIntArray(dynamic_int_array_t * the_array, int length)
{
/*
Allocate memory to contain length number of integers
*/
the_array->data = (int*)malloc(length*sizeof(int));
the_array->length = length;
}
void freeIntArray(dynamic_int_array_t * the_array)
{
if(NULL != the_array->data)
free(the_array->data);/*Free the memory*/
the_array->length = 0;/*Reset the length of the array*/
}
void resizeIntArray(dynamic_int_array_t * the_array, int new_length)
{
if(NULL != the_array->data && the_array->length > 0 && new_length >= 0)
{
if(new_length == 0)/*Free the array if a value of 0 was requested*/
the_array->free(the_array);
else
{
/*Resize the memory block*/
the_array->data = (int*)realloc(the_array->data, new_length*sizeof(int));
}
the_array->length = new_length;
}
}
void appendIntArray(dynamic_int_array_t * the_array, int new_value)
{
the_array->resize(the_array, the_array->length + 1);
the_array->data[the_array->length - 1] = new_value;
}
int getAt(dynamic_int_array_t * the_array, int pos)
{
if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
return the_array->data[pos-1];
return INT_MIN;/*use INT_MIN to indicate error*/
}
void setAt(dynamic_int_array_t * the_array, int pos, int value)
{
if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
the_array->data[pos-1] = value;
}
int main(int argc, char **argv)
{
dynamic_int_array_t int_array =
{
0,
NULL,
allocIntArray,
freeIntArray,
resizeIntArray,
appendIntArray,
getAt,
setAt
};
int_array.alloc(&int_array, 4);
int_array.data[0] = 1, int_array.data[1] = 2,
int_array.data[2] = 3, int_array.data[3] = 4;
printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,4));
int_array.resize(&int_array, 5);
int_array.data[4] = 5;/* can also use int_array.set_at(&int_array,5) = 5; */
printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
int_array.append(&int_array, 6);
printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
}