Ped*_*ias 3 c malloc pointers char
在处理库时,在提供的示例源代码中我找到了以下代码:
x = (double *) malloc (narcs * sizeof (double));
dj = (double *) malloc (narcs * sizeof (double));
pi = (double *) malloc (nnodes * sizeof (double));
slack = (double *) malloc (nnodes * sizeof (double));
Run Code Online (Sandbox Code Playgroud)
我在这里找不到什么特别的东西,但在释放内存时,源代码示例执行以下操作:
free_and_null ((char **) &x);
free_and_null ((char **) &dj);
free_and_null ((char **) &pi);
free_and_null ((char **) &slack);
Run Code Online (Sandbox Code Playgroud)
free_and_null代码是:
static void
free_and_null (char **ptr)
{
if ( *ptr != NULL ) {
free (*ptr);
*ptr = NULL;
};
};
Run Code Online (Sandbox Code Playgroud)
我的问题不是为什么,当释放先前分配的内存时,它会对char双指针进行转换.我的问题是为什么这样做是这样的,使用自定义函数释放内存以及为什么选择a char **作为此函数的参数.
我知道当然这个问题正在发生,因为我对C语言的知识仍然有限,但无论如何,任何人都可以解释为什么这样做,如果这是一个好习惯.
我必须同意你的看法 - 代码有点奇怪.作者没有理由不能void **轻易使用.
此外,if (*ptr != NULL)检查是不必要的,因为free(NULL)完全合法.在;括号后面的字符是没有必要的要么.
更简单的版本可能如下所示:
static void free_and_null(void **ptr)
{
free(*ptr);
*ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
这个函数存在的原因是确保释放指针被设置为NULL,这有助于检测释放后使用的错误并完全避免双重错误.
编辑:正如StarPilot在下面建议的那样,检查它ptr本身不是NULL 可能是个好主意:
static void free_and_null(void **ptr)
{
if (ptr)
{
free(*ptr);
*ptr = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)