在下面的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;
}
答案 0 :(得分:2)
指针只是一个普通变量,它以其他值作为地址。换句话说,指针指向可以找到其他内容的地址。
分配时:
c = calloc(2,sizeof(float *));
您正在将新内存块的起始地址分配给c
。换句话说c
指向内存中可以找到您分配的第一个(两个)指针的位置。
分配(动词)时:
assign = c;
您正在将assign
保留的值设置为c
保留的值。 (以及c
持有什么?-您用calloc
分配的内存块的地址)。因此,assign
现在与c
拥有相同的地址,例如assign
现在指向您分配的前两个指针。因此,assign
和c
现在都拥有与其值相同的地址,您可以使用其中任何一个来引用存储在其中的内容。
注意:无需强制返回malloc
的返回值,这是不必要的。请参阅:Do I cast the result of malloc?。此外,如果您使用取消引用的指针为分配设置 type-size ,则可以避免出错的机会,例如
c = calloc (2, sizeof *c);