1

我正在用 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是一个有效的内存地址,当我尝试释放它时不会出现段错误?

4

2 回答 2

2

对此只有一个答案:你不能。

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

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

于 2013-03-24T17:09:32.943 回答
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);
   ...
}
于 2013-03-24T17:22:17.463 回答