如果我们将一个指针赋值给另一个指针,这被称为“交换指针”。例如,
如果我在最后一行之后添加
float *temp, *ptr1, *ptr2;
temp = ptr1;
ptr1 = ptr2;
ptr2 = temp;
然而,如果我们将数组分配给指针,这是不合法的,因为数组实际上不是指针类型。但看看下面的3个例子:
float arr[]={1.2, 1.9, 3.1};
float *ptr;
int i;
ptr = (float *)calloc(3,sizeof(float));
ptr = arr;
for (i=0;i<3;i++){
printf("ptr[%d]=%f\n",i,ptr[i]);
}
这段代码片段经过编译并正确运行(非法代码也能得到正确的答案?):
ptr[0]=1.200000
ptr[1]=1.900000
ptr[2]=3.100000
如果我在最后一行之后添加
free(ptr)
,即:float arr[]={1.2, 1.9, 3.1};
float *ptr;
int i;
ptr = (float *)calloc(3,sizeof(float));
ptr = arr;
for (i=0;i<3;i++){
printf("ptr[%d]=%f\n",i,ptr[i]);
}
free(ptr); /*add free here*/
这次出现了一个警告:
warning: attempt to free a non-heap object ‘arr’ [-Wfree-nonheap-object]
int i;
int flag=0;
float arr1[3]={1.07,3.01,5.02};
float arr2[3]={2.07,6.01,9.02};
float arr3[3]={3.07,8.01,0.02};
float *ptr;
ptr = (float *)calloc(3,sizeof(float));
if(flag==0){
ptr = arr1;
}
else if(flag==1){
ptr = arr2;
}
else{
ptr = arr3;
}
for (i=0;i<3;i++){
printf("ptr[%d]=%f\n",i,ptr[i]);
}
使用不同的标记
可以正确运行,但如果在最后一行添加free(ptr)
,它仍然会像之前一样出现警告。
有人能帮忙分析原因吗?
ptr
的值以保存该内存位置。在下一行中,将ptr
的值更改为保存arr
数组的地址,使之前分配的内存变成了孤立状态。由于ptr
指向的内存实际上是一个包含三个浮点数的文字数组,因此您无法释放它。您应该释放的内存已经泄漏了。 - Tibrogarganmalloc
calloc
realloc
,请注意以下两点:1)返回类型是void*
,可以分配给任何指针。强制转换只会使代码变得混乱,难以理解、调试等。2)始终检查(!= NULL)返回值以确保操作成功。 - user3629249ptr = arr1;
和类似的语句。这会覆盖通过调用calloc()
设置在指针中的值,导致内存泄漏。也许你想表达的是:memcpy( ptr, arr1, sizeof( arr1) );
注意:在 C 中,引用数组名称会降级为数组第一个字节的地址。 - user3629249