如何检查值是否代表地址

时间:2013-03-24 17:07:25

标签: c pointers memory-management

我正在用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时,如何检查{{1}}是否是有效的内存地址?

2 个答案:

答案 0 :(得分:2)

只有一个答案:你做不到。

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

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

答案 1 :(得分:1)

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

请注意,此功能已过时,不是线程安全的,不建议使用。您可以将其视为“不要使用它”。

另外,你不能释放一些任意地址。您无法确定您使用的内存分配是否与操作系统使用的内存相同。除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);
   ...
}