使用2D指针而不分配

时间:2019-01-19 03:11:23

标签: c pointers dynamic-memory-allocation

在下面的C代码中,我分配,初始化和定义**c的值。我希望**assign接受**c的值。但是我只声明了**assign的2D指针,没有分配内存,并且代码成功运行并输出了与**c相同的结果。不知道为什么

int main(){

    int i,j;
    float **c=NULL, **assign=NULL;
    c = (float **)calloc(2,sizeof(float *));
    for (i=0;i<2;i++){
        c[i] = (float *)calloc(3,sizeof(float));
    }

    for (i=0;i<2;i++){
        for (j=0;j<3;j++){
            c[i][j] = i+j;
            printf("c[%d][%d]=%f\n",i,j,c[i][j]);
        }
    }

    assign = c;
    for (i=0;i<2;i++){
        for (j=0;j<3;j++){
            printf("assign[%d][%d]=%f\n",i,j,assign[i][j]);
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:2)

指针只是一个普通变量,它以其他值作为地址。换句话说,指针指向可以找到其他内容的地址。

分配时:

c = calloc(2,sizeof(float *));

您正在将新内存块的起始地址分配给c。换句话说c指向内存中可以找到您分配的第一个(两个)指针的位置。

分配(动词)时:

assign = c;

您正在将assign保留的值设置为c保留的值。 (以及c持有什么?-您用calloc分配的内存块的地址)。因此,assign现在与c拥有相同的地址,例如assign现在指向您分配的前两个指针。因此,assignc现在都拥有与其值相同的地址,您可以使用其中任何一个来引用存储在其中的内容。

注意:无需强制返回malloc的返回值,这是不必要的。请参阅:Do I cast the result of malloc?。此外,如果您使用取消引用的指针为分配设置 type-size ,则可以避免出错的机会,例如

c = calloc (2, sizeof *c);