小编Gam*_*Gam的帖子

使用void*,void**和可变参数函数

我想编写一个可以释放尽可能多的指针的函数.所以我有这个:

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 variadic-functions void-pointers

5
推荐指数
1
解决办法
254
查看次数

我应该使用#include <file.h> 还是“file.h”?

有两种方法可以在 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) ?为什么 ?也许这只是个人选择?是否有不同的情况需要了解?

谢谢阅读 :)

编辑:我不是在寻找这两种方式之间的区别(我想我已经按照我的解释理解了它们,感谢这篇文章),我想知道是否有一些特殊情况需要了解,也许用于小组工作或使用同一程序的不同编译器......也许我不知道如何表达我的想法(或者这是一个没有真正答案的愚蠢问题),我必须尝试知道:)。

c include

3
推荐指数
1
解决办法
2903
查看次数

标签 统计

c ×2

include ×1

variadic-functions ×1

void-pointers ×1