C 和 C++ 中的术语数组都用于表示包含一个或多个相同类型的数据元素的连续内存块。
数组有两种类型:静态数组和动态数组。静态数组是在编译程序时在内存中分配的,并存储在程序的数据段中。顾名思义,动态数组是在运行时从堆(用于访问程序可用于动态分配的内存的数据结构)分配的。
使用指针和索引器([] 运算符)以相同的方式访问这两种数组类型。
在 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));
}