我正在用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}}是否是有效的内存地址?
答案 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);
...
}