C语言中的整数指针数组

o4hqfura  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(84)

我对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++) {
任何答案都是高度赞赏的。
先谢了。

pinkon5k

pinkon5k1#

前几个示例中的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 '!它们知道自己的长度,而且它们是可扩展的。

11dmarpk

11dmarpk2#

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

xoefb8l8

xoefb8l83#

逗号分隔的值列表是用于初始化数组的构造。它不适合初始化指向数组的指针。这就是为什么你需要(int[])-它告诉gcc创建一个未命名的整数数组,用提供的值初始化。
gcc不会让你丢失arr是一个数组的信息,除非你真的想这样做。所以你需要石膏。最好将arr声明为数组,而不是指针。你仍然可以把它传递给接受指针的函数。但是gcc不会让你用malloc泄漏内存:

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

如果你想要一个变量,它可以是一个数组,也可以是一个指向已分配内存的指针,那么就为它创建另一个变量。更好的方法是,创建一个接受指针的函数,并将数组或指针传递给它。

qnakjoqk

qnakjoqk4#

我觉得我可以进一步澄清接受的答案。
当你初始化一个数组时,例如,

int arr1[]={1,2,3,4,5};

这将在堆栈上保留内存,用值{1,2,3,4,5}填充它,并将arr设置为指向此内存块的指针。
当你用new初始化数组时:

arr2 = new float[5];

这将保留heap上的内存,并返回指向该内存块的指针。如果你打电话:

arr2 = arr1;

你会丢失为arr2预留的heap内存地址。这是内存泄漏。
正确的方法是使用memcpyarr1值从堆栈复制到堆:

memcpy(arr2, arr1, sizeof(arr1)); // src, dest, #bytes

相关问题