Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中将数组声明为指针_C_Arrays_Pointers - Fatal编程技术网

在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)的不是一个声明,而是一个动态分配,它完全独立于声明,与声明的内容具有完全不同的生存期,等等。