C 如何检查值是否表示地址

C 如何检查值是否表示地址,c,pointers,memory-management,C,Pointers,Memory Management,我正在用C编写一个函数,它以一个数组作为输入,以两个数组作为输出。函数将写入作为参数传入的数组。作为防止内存错误的“故障保护”,我想检查传入函数的指针是否为有效内存地址,如果是,则释放它。以下是迄今为止我掌握的代码,其中有一部分我仍然不确定: int fft( double* signal, double* real, double* imag, int size ) { double retVal; /*initialize output arrays*/ if( /

我正在用C编写一个函数,它以一个数组作为输入,以两个数组作为输出。函数将写入作为参数传入的数组。作为防止内存错误的“故障保护”,我想检查传入函数的指针是否为有效内存地址,如果是,则释放它。以下是迄今为止我掌握的代码,其中有一部分我仍然不确定:

int fft( double* signal, double* real, double* imag, int size ) {
    double retVal;

    /*initialize output arrays*/
    if( /*real is a valid memory address */ ) {
        free( real );
    }

如何检查
real
是一个有效的内存地址,当我尝试释放它时,它不会将故障隔离?

只有一个答案:你不能

如果它是一个有效的指针,它将指向一个有效的地址。没有标准的方法来判断堆上是否分配了内存块


唯一的解决方案是,您需要一个参数,使指针指向堆分配的内存块。或者更好的方法是,让函数的调用者释放调用者分配的内存。

有时,您可以检查您是否具有对某个指针的写访问权限。例如,在Windows中,您可以使用函数

请注意,此函数已过时,不是线程安全的,不建议使用。你可以把它理解为“不要使用它”

另外,你不能释放一些任意地址。您无法确定您使用的内存分配与操作系统使用的内存分配相同。除了通过
malloc
/
realloc
调用获得的地址外,您不能释放其他地址

在您的情况下,最好遵循WinAPI准则:需要两个大小为的指针,如果没有空间容纳结果,则返回错误代码。或者,您可以要求两个指向指针的指针,然后自己分配内存,返回数据并指定调用者必须释放内存

int fft( double* signal, double** real, double** imag, int size ) {
   int retval_size = 256;
   *real = (double*)malloc(sizeof(double) * retval_size);
   *imag = (double*)malloc(sizeof(double) * retval_size);
   ...
}

“我想如果你必须检查一下,你是在用错误的方式做事情。”格罗诺斯塔伊我这样做的原因是为了确保没有任何问题。它是为了防止用户无意中传入错误的内存地址,而不会导致整个程序崩溃。如果您让用户输入任意内存地址,那么您就犯了大错。@gronostaj我无法控制用户输入的内容。我希望程序能够在用户输入错误的情况下优雅地处理它。但是为什么要向用户询问内存地址呢?他怎么会知道该进什么?你的程序不应该自己处理这些事情吗?。