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

shi*_*bly 12 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;
}
Run Code Online (Sandbox Code Playgroud)

但这很有效.

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

他们为什么不一样?

    arr=(int*){3,1,4,5,2};
    arr=(int[]){3,1,4,5,2};
Run Code Online (Sandbox Code Playgroud)

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

arr[0]=3;
arr[1]=1;
arr[2]=4;
arr[3]=5;
arr[4]=2;
Run Code Online (Sandbox Code Playgroud)

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

任何答案都非常感谢.

提前致谢.

Ern*_*ill 9

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

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

int* arr = (int *) malloc(sizeof(int) * 5);
for (int i=0; i<5; ++i)
    arr[i] = i;
Run Code Online (Sandbox Code Playgroud)

但是你无法直接分配任何其他内容arr,或者你丢失了指向该内存块的指针.当您使用时分配块时malloc(),不要忘记在free()不再需要时使用它来删除它.

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

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

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


Ste*_*nko 7

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

  • @stiv很抱歉与你发生冲突,但是数组和指针在C中是两个非常不同的东西.如果你不相信我就试试这个:`int a [3]; printf("sizeof(a)=%d \n",(int)sizeof(a)); printf("sizeof(a + 0)=%d \n",(int)sizeof(a + 0));`第一个`printf()`打印12,第二个8.为什么?因为在`a + 0`中,数组标识符衰减为指针,这与数组非常不同. (3认同)