14

我对 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++) {静态的?

任何答案都非常感谢。

提前致谢。

4

3 回答 3

16

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

换句话说,如果您使用 using 分配一块内存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'!它们知道自己的长度,而且它们是可扩展的。

于 2012-05-16T23:56:04.527 回答
5

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

于 2012-05-16T23:56:21.360 回答
2

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

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

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

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

于 2013-11-25T22:17:00.827 回答