我想编写一个可以释放尽可能多的指针的函数.所以我有这个:
void myfree(size_t n, ...)
{
void **del;
va_list ap;
va_start(ap, n);
while (n > 0)
{
del = va_arg(ap, void **);
free(*del);
*del = NULL;
--n;
}
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
char *one = malloc(x);
sometype_t *two = malloc(x);
myfree(2, &one, &two);
Run Code Online (Sandbox Code Playgroud)
我假设one并且two现在指向NULL.它似乎有效,但我仍然有点担心.我做了一些研究,void**但我不确定我的功能是否真的有效(UB你在那里吗?)
在我的研究和测试中,我尝试了一些我不太懂的东西.
假设我们有这个功能
void f(void **ptr)
{
}
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它
int *intptr = NULL;
f(&intptr);
Run Code Online (Sandbox Code Playgroud)
我收到编译器警告: warning: incompatible pointer types passing 'int **' to parameter of type 'void **'
所以我尝试了这个
int *intptr = …Run Code Online (Sandbox Code Playgroud) 有两种方法可以在 C 中包含文件:
#include <headerpath/header.h>
Run Code Online (Sandbox Code Playgroud)
或者
#include "headerpath/header.h"
Run Code Online (Sandbox Code Playgroud)
第一个将使用编译器已知的目录查找文件,因此我们可以在不知道它们在哪里的情况下包含标准文件。第二种方法将仅使用引号之间的路径来查找文件。(如果搜索失败,编译器会尝试第一种方式)。
我们有可能将一个或多个目录添加到编译器知道的目录列表中(第一种方式)。例如使用 gcc 我们可以-I选择。
所以最后,下面这两个代码是等价的(path_to_header 是一个目录):
1)
#include "path_to_header/header.h"
int main(void)
{
return (0);
} // Compiling with : gcc main.c
Run Code Online (Sandbox Code Playgroud)
2)
#include <header.h>
int main(void)
{
return (0);
} // Compiling with : gcc main.c -I path_to_header
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:以我自己的头文件为例,我应该使用 1) 还是 2) ?为什么 ?也许这只是个人选择?是否有不同的情况需要了解?
谢谢阅读 :)
编辑:我不是在寻找这两种方式之间的区别(我想我已经按照我的解释理解了它们,感谢这篇文章),我想知道是否有一些特殊情况需要了解,也许用于小组工作或使用同一程序的不同编译器......也许我不知道如何表达我的想法(或者这是一个没有真正答案的愚蠢问题),我必须尝试知道:)。