初始化数组与错置内存有何不同?

How is initializing an array different from mallocing memory?

本文关键字:何不同 内存 数组 初始化      更新时间:2023-10-16

我是c++新手。我有困难区分初始化数组和错置内存。在我看来,它们似乎达到了同样的目的。

具体来说,我可以通过int myArray[] = {1, 2, 3};初始化一个数组。我也可以使用malloc来获取内存并将其分配给一个void指针。之后,我释放这个内存。

这两种方法的区别是什么?计算机是否以相同的方式将数据存储在相同的位置?

在c++中有两种不同的分配内存的方式。第一种方法是在堆栈上分配内存。

int arr[] = {1,2,3};
int arr[3];

这两行代码都在堆栈上创建了一个大小为3的数组。唯一的区别是第一行也初始化了数组中的值。

第二种分配内存的方法是在堆上。堆上可用的内存量通常比堆栈上可用的内存量大得多。newmalloc操作在堆上分配内存。

int* arr = (int*) malloc(100*sizeof(int));
int* arr = new int[100];

这两行代码在堆上创建了一个大小为100的数组。这是两者的区别。在c++中,您应该始终使用new,因为它确保调用数组中每个元素的构造函数。它也更加类型安全,不像malloc,它根本不是类型安全的,因为它只是返回void*到一个字节块,可以按照您的意愿进行解释。

如果你是动态分配内存,这意味着你不知道数组的大小,直到运行时,你应该总是使用new/malloc在堆上分配它。

最后要注意的是如何使用delete/free来释放内存。

free(arr); //arr was allocated with malloc
delete[] arr; //arr was allocated with new

如果你用new分配内存,它必须用delete释放。你不能混合和匹配new/mallocdelete/free。最后,delete[]释放一个对象数组。如果您只分配了一个对象,那么您只需使用delete

Object* myobj = new Object;
delete myobj;

我认为这个问题不属于这里。但我会回答的。你可以这样做:

 int* myArray = (int *) malloc(3 * sizeof(int));

这意味着你正在创建内存大小为3 * sizeof(int)的内存位置[即C中整数数据类型的大小],并且你返回一个指向该内存位置的int指针。[即一个指针,指向它的开始,并处理它,如果它包含整数]。这些内存槽被转换为int *(使用(int *)),并称为myArray。myArray是一个int数组(和一个int指针)。因为数组在c语言中实际上是指针。

 for (int i = 0; i < 3; i++) 
     myArray[i] = i + 1;

malloc中可能有一些问题。因此,初始化后总是检查myArray == NULL。如果是这种情况,请修复错误,并且不要用${1,2,3}$初始化数组。否则,您将得到一个分段错误。

我希望我对你不含糊其词。但是由于您正在使用c++,我建议您使用new操作符。你可以这样做:
 int myArray[] = new int[3];