指向易失数据的空指针

时间:2014-01-14 10:18:33

标签: c pointers free volatile

我正在尝试释放指向易失性缓冲区的指针(指针不是易变的[我认为......])

void try_this(volatile int* vint)
{
    free(vint);
}

给了我:

警告:传递'free'的参数1从指针目标类型中删除限定符

这似乎提供了一个适用于释放的解释:int * volatile vint http://lists.freebsd.org/pipermail/freebsd-hackers/2005-January/009652.html

似乎暗示因为指针可能指向无效内存(因为它是易失性的,它可能在程序/线程的正常流程之外发生了变化),这就是为什么不鼓励这种行为,但是...在这种情况下指针(据我所知)不是易失性的,它指向那些易失性的数据,肯定是免费的,如果这种情况发生变化则不在乎?

有人能提供更好的解释吗? (或者为什么我完全错了!)

2 个答案:

答案 0 :(得分:2)

你的假设不正确。由于volatile写在*的左侧,这意味着您有一个指向易失性数据的指针。与任何动态分配的数据一样,此数据可能会在mallocfree之间随意更改。 free功能无关紧要。

如果由于某种原因你有int* volatile vint,那么你会有一个易失性指针指向数据并且你的关注点是有效的,因为那时可能无法保证指针本身在mallocfree之间保持不变。但是没有理由编写这样的代码,所以这不是一个问题。

您收到警告的实际原因仅仅是因为free需要void*并且您正在传递volatile int*。 C可以在void*int*之间进行隐式转换,但是如果你添加一个类型限定符,例如volatileconst,那么一个体面的编译器会发出警告而不是静默接受演员。

您可以通过键入free((int*)vint)free((void*)vint)来解决问题,它们同样正确。


根据经验:可以将常规指针转换为constvolatile,但不是相反:

int* a;
const int* b=a;    // fine
int* c=b;          // possible bug and/or bad practice
volatile int* d=a; // fine
int* e=d;          // possible bug and/or bad practice

答案 1 :(得分:1)

警告不是free特有的,与free的内容没有任何关系,只是因为volatile中没有free限定词原型。如果您不想要警告,只需使用演员:

free((void*)vint);