【发布时间】:2019-01-19 03:11:23
【问题描述】:
在下面的 C 代码中,我为 **c 分配、初始化和定义值。我希望**assign 采用**c 的值。但是我只为**assign声明了一个二维指针,没有内存分配,代码运行成功,打印出和**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;
}
【问题讨论】:
-
c和assign是指针,而不是数组。代码只是用assign = c;分配一个指针。 -
两个指针可以指向同一个内存。只要指向的内存被正确分配,这是完全安全的。您不必为每个指针单独分配。话虽如此,请注意,在 C 中说“代码运行成功”并不总是证明代码是正确的。未定义的行为通常看起来像大多数时间“成功运行”的代码。
-
@JohnColeman 所以你的意思是代码是正确的,但我的话不合理?
-
@james 我不知道你的代码是否正确。我没有运行它,也没有深入思考它。没有什么能对我产生影响。我只是想提醒一下,不要过多解读代码似乎正在运行的事实。
标签: c pointers dynamic-memory-allocation