Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向易失性数据的自由指针_C_Pointers_Free_Volatile - Fatal编程技术网

C 指向易失性数据的自由指针

C 指向易失性数据的自由指针,c,pointers,free,volatile,C,Pointers,Free,Volatile,我试图释放指向易失性缓冲区的指针(指针不是易失性的[我认为…]) 给我: 警告:传递“free”的参数1将丢弃指针目标类型的限定符 这似乎为释放提供了一个有效的解释:int*volatile vint 这似乎表明,由于指针可能指向无效内存(因为它是易失性的,它可能在程序/线程的正常流之外发生了更改),这就是为什么不鼓励这种行为,但是。。。本例中的指针(据我所知)不是易失性的,它指向的数据是易失性的,当然是自由的,你不应该在意它是否会改变吗 有人能提供更好的解释吗?(或者我完全错了的原因!)这个

我试图释放指向易失性缓冲区的指针(指针不是易失性的[我认为…])

给我:

警告:传递“free”的参数1将丢弃指针目标类型的限定符

这似乎为释放提供了一个有效的解释:
int*volatile vint

这似乎表明,由于指针可能指向无效内存(因为它是易失性的,它可能在程序/线程的正常流之外发生了更改),这就是为什么不鼓励这种行为,但是。。。本例中的指针(据我所知)不是易失性的,它指向的数据是易失性的,当然是自由的,你不应该在意它是否会改变吗


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

这个警告不是针对
free
的,也与
free
的功能无关,只是因为
free
的原型中没有
volatile
限定符。如果您不想看到警告,只需使用强制转换:

free((void*)vint);

该警告并不特定于
free
,也与
free
的功能无关,只是因为
free
的原型中没有
volatile
限定符。如果您不想看到警告,只需使用强制转换:

free((void*)vint);

你的假设是错误的。由于
volatile
写在
*
的左侧,这意味着您有一个指向volatile数据的指针。与任何动态分配的数据一样,此数据可以在
malloc
free
之间随意更改。
free
功能并不重要

如果您出于某种原因拥有
int*volatile vint
,那么您将拥有一个指向数据的volatile指针,您的关注点将是有效的,因为这样可能无法保证指针本身在
malloc
free
之间保持不变。但是没有理由编写这样的代码,所以不必担心

您收到警告的实际原因很简单,因为
free
需要
void*
并且您正在传递
volatile int*
。C可以在
void*
int*
之间执行隐式强制转换,但是如果您添加类型限定符,例如
volatile
const
,那么体面的编译器将给出警告,而不是默默地接受强制转换

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


根据经验:将常规指针转换为带有
const
volatile
的指针是可以的,但反过来不行:

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

你的假设是错误的。由于
volatile
写在
*
的左侧,这意味着您有一个指向volatile数据的指针。与任何动态分配的数据一样,此数据可以在
malloc
free
之间随意更改。
free
功能并不重要

如果您出于某种原因拥有
int*volatile vint
,那么您将拥有一个指向数据的volatile指针,您的关注点将是有效的,因为这样可能无法保证指针本身在
malloc
free
之间保持不变。但是没有理由编写这样的代码,所以不必担心

您收到警告的实际原因很简单,因为
free
需要
void*
并且您正在传递
volatile int*
。C可以在
void*
int*
之间执行隐式强制转换,但是如果您添加类型限定符,例如
volatile
const
,那么体面的编译器将给出警告,而不是默默地接受强制转换

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


根据经验:将常规指针转换为带有
const
volatile
的指针是可以的,但反过来不行:

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

由于您必须只对
malloc
的结果调用
free
,并且
malloc
从不生成指向volatile的指针,因此您要么做错了什么,要么可以强制转换。我猜这是从一个线程程序中调用的,其中malloc'ed区域由多个线程使用?在释放它之前,请确保所有其他线程都已使用完它。基本上,嵌入式应用程序涉及ISR,现在我意识到malloc从未生成指向volatile的指针,这就更有意义了,谢谢!由于您必须只对
malloc
的结果调用
free
,并且
malloc
从不生成指向volatile的指针,因此您要么做错了什么,要么可以强制转换。我猜这是从一个线程程序中调用的,其中malloc'ed区域由多个线程使用?在释放它之前,请确保所有其他线程都已使用完它。基本上,嵌入式应用程序涉及ISR,现在我意识到malloc从未生成指向volatile的指针,这就更有意义了,谢谢!