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

时间:2012-05-16 23:51:17

标签: c arrays pointers

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

这不起作用。

#include <stdio.h>
#include <stdlib.h>

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 <stdio.h>
#include <stdlib.h>

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 <stdio.h>
#include <stdlib.h>

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++) {

任何答案都非常感谢。

提前致谢。

3 个答案:

答案 0 :(得分:9)

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

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

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

但是你不能直接向arr分配任何其他内容,否则你将丢失指向该内存块的指针。当您使用malloc()分配阻止时,请不要忘记在不再需要时使用free()将其删除。

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

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

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

答案 1 :(得分:6)

当您说:ptr = {1,2,3,4,5}时,您将ptr指向数据段中的内存,其中常量数组{1,2,3,4,5}驻留,因此您正在泄漏内存。如果要在分配后初始化内存,请写入:ptr[0]=1; ptr[1]=2;,依此类推。如果您要复制数据,请使用 memcpy

答案 2 :(得分:2)

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

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

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

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