2013-03-24 2 views
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 является действительным адресом памяти, не сегментное вино при попытке освободить его ?

+0

Я думаю, вы не можете –

+1

Я думаю, если вам нужно проверить это, вы делаете что-то не так. – gronostaj

+0

@ gronostaj Хорошо, что я делаю это, чтобы убедиться, что ничего не получилось. Это предотвращает непреднамеренное переключение пользователя на плохой адрес памяти без разваливания всей программы. – Ataraxia

ответ

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); 
    ... 
} 
+0

[IsBadXxxPtr действительно следует называть CrashProgramRandomly] (http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx). –

2

Существует только один ответ на этот вопрос: вы не можете.

Если это действительный указатель, он указывает на действительный адрес. Нет стандартного способа сообщить, был ли выделен блок памяти в куче или нет.

Единственное решение состоит в том, что вам нужен аргумент, указывающий указатель на блок памяти, выделенный кучей. Или еще лучше, позвоните вызывающей стороне вашей свободной памяти, которую назначил вызывающий.

Смежные вопросы