在C中初始化整数指针数组

我对C中指针的使用有一些困惑/问题。我已经把下面的示例代码轻松地理解了。 请注意这些代码的不同之处。 如果您对它有一些问题,请收到反馈。

这不起作用。

#include  #include  void process() { int *arr; arr=(int*)malloc(5*sizeof(int)); arr=(int*){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 

但这很有效。

 #include  #include  void process() { int *arr; arr=(int*)malloc(5*sizeof(int)); arr=(int[]){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 

这也有效。 为什么? 我没有在这里分配内存。

 #include  #include  void process() { int *arr; arr=(int[]){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 

他们为什么不一样?

  arr=(int*){3,1,4,5,2}; arr=(int[]){3,1,4,5,2}; 

有没有其他方法来初始化整数指针数组,而不是在这种单独的分配方式中使用?

 arr[0]=3; arr[1]=1; arr[2]=4; arr[3]=5; arr[4]=2; 

如何在指针的内存中获得分配的大小/数量,以便我可以使用类似for(int z=0;z<NUM;z++) {而不是for(int z=0;z<5;z++) {静静地?

任何答案都非常感谢。

提前致谢。

当你说: ptr = {1,2,3,4,5} ,你让ptr指向数据段中的一个内存,其中常量数组{1,2,3,4,5}存在,因此你正在泄漏记忆。 如果要初始化内存,请在分配后写入: ptr[0]=1; ptr[1]=2; ptr[0]=1; ptr[1]=2; 等等。 如果要复制数据,请使用memcpy

在前几个示例中, malloc调用分配一块内存并将指向该内存的指针分配给arr 。 一旦再次分配给arr ,指针值就会被覆盖,并且你已经忘记了分配的内存 – 也就是说,你已经泄露了它。 那是一个错误。

换句话说,如果使用malloc()分配内存块,则可以使用数组语法将数据写入其中(例如):

 int* arr = (int *) malloc(sizeof(int) * 5); for (int i=0; i<5; ++i) arr[i] = i; 

但是你不能直接将任何其他东西分配给arr ,否则你会失去指向arr内存的指针。 当你使用malloc()分配一个块时,不要忘记在不再需要时使用free()删除它。

数组不是指向整数的指针; 这是一个数组。 当一个数组名称作为参数传递给接受指针作为参数的函数时,它被称为“衰减到指针”,但它们不是同一个东西。

关于你的上一个问题:这实际上是数组和指向类型的指针之间的区别:编译器知道数组的大小,但它不知道任意指向类型指向的块的大小。 不幸的是,答案是否定的。

但是既然你在编写C ++而不是C语言,那么你不应该使用数组:使用`std :: vector'! 他们知道自己的长度,而且他们是可扩展的。

逗号分隔的值列表是用于初始化数组的构造。 它不适合初始化指向数组的指针。 这就是你需要它的原因(int[]) – 它告诉gcc创建一个用提供的值初始化的未命名的整数数组。

除非你真的想要,否则gcc不会让你丢失arr是一个数组的信息。 这就是你需要演员的原因。 最好将arr声明为数组,而不是指针。 您仍然可以将它传递给接受指针的函数。 然而gcc不会让你用malloc泄漏内存:

 error: incompatible types when assigning to type 'int[5]' from type 'void *' 

如果您想要一个可以是数组的变量或指向已分配内存的指针,请为此创建另一个变量。 更好的是,创建一个接受指针并将其传递给数组或指针的函数。