在C中将数组声明为指针
我有一个数组的声明,比如在C中将数组声明为指针,c,arrays,pointers,C,Arrays,Pointers,我有一个数组的声明,比如 int a1[5]; 如果我这样声明此数组: int *a2; a2 = malloc(sizeof(int)*5); 然后像使用数组a1一样使用它,有什么区别。此外,如果在函数中执行此操作,并且函数结束a1和a2,则超出范围。在a1的情况下,内存会自动释放,但在a2的情况下,内存是自动释放的,还是我们必须使用delete来释放它?a2的内存不会自动释放。您可以始终遵循这个简单的经验法则-如果您使用malloc分配它,您需要使用free来取消分配它。当您编写 int
int a1[5];
如果我这样声明此数组:
int *a2;
a2 = malloc(sizeof(int)*5);
然后像使用数组a1一样使用它,有什么区别。此外,如果在函数中执行此操作,并且函数结束a1和a2,则超出范围。在a1的情况下,内存会自动释放,但在a2的情况下,内存是自动释放的,还是我们必须使用delete来释放它?
a2的内存不会自动释放。您可以始终遵循这个简单的经验法则-如果您使用malloc
分配它,您需要使用free
来取消分配它。当您编写
inta[10]代码>
你说
“给我分配10个内存块,每个内存块可以存储一个整数
价值观”
默认情况下,将此定义放入块(由{
和}
包围的部分代码)时,不能在块外使用变量a
为什么??假设程序在一个块内执行指令,它遇到了这个定义。它分配一些内存来存储变量a。当程序发现它已到达块的末尾时,它将销毁它在块中分配的全部内存。因此,当您在右括号(}
)后面的代码中引用a时,它不知道a是什么,因为内存被破坏了
另一方面,当你写作的时候
int*a=(int*)malloc(10*(sizeof(int))代码>
你说
“给我分配10块特殊内存,每个内存块都可以存储
整数值“
。这种特殊的内存称为堆内存。它之所以特别,是因为它存在于一个从未被摧毁过的新地方(除非你要求)。因此,您甚至可以在块之外访问它。数组不是指针。指针不是数组。不能将一个声明为另一个。您可以将指针指向数组,但这与声明其中任何一个都无关。谢谢您的评论。作为两个比较声明的最终结果,内存映射中有什么不同?如果我错了,请纠正我,但我认为这两种类型的声明都会导致5*sizeof(int)存储位置的连续内存空间。因此,问题是区别是什么?第二个片段声明的唯一内容是指针。导致连续内存空间大小为5*sizeof(int)的不是一个声明,而是一个动态分配,它完全独立于声明,与声明的内容具有完全不同的生存期,等等。