- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
几周前,我了解了如何在函数内部分配和释放指针的正确方法,如示例 linkedList 所示:
typedef struct _node {
void *data;
struct _node *next;
} Node;
typedef struct _linkedList {
Node *head;
Node *tail;
Node *current;
} LinkedList;
在我看来,销毁队列的正确方法是使用获取指向我要删除的节点的指针的函数:
void destroy (Node ** node)
或者在更真实的示例中,指向要删除的指针和指向列表的指针。
void destroy (LinkedList * list, Node ** node)
但现在我正在阅读“Understanding C pointers”一书,我遇到了问题,因为在第 6 章指向结构的指针中有函数 destroyList 的示例:
void delete(LinkedList *list, Node *node) {
if (node == list->head) {
if (list->head->next == NULL) {
list->head = list->tail = NULL;
} else {
list->head = list->head->next;
}
} else {
Node *tmp = list->head;
while (tmp != NULL && tmp->next != node) {
tmp = tmp->next;
}
if (tmp != NULL) {
tmp->next = node->next;
}
}
free(node); //free on pointer copy value not pointer
}
所以在这个例子中,作者在按值传递的指针上自由运行,所以在我看来这不应该起作用。但是我查看了勘误表,没有关于这个例子的注释。
在这种情况下,我理解 List 是使用正确列表实例的函数参数,但应该是:
free(list->head) ; //It should work?
然后还为分配的列表释放内存。
我说的对吗?因为看了这个例子,我觉得我对这个主题的理解有问题。
我还去了 Linux 手册页,我看到了免费的原型(prototype):
void free(void *ptr); // http://linux.die.net/man/3/free
那么,为什么每个人都告诉您在要释放内存时将指针传递给指针,但在标准库中,相同的自由函数将指针作为参数而不是指向指针的指针,它如何正确工作?
最佳答案
正如您正确陈述的那样,free( void *p )
释放了 p
指向的内存,但是由于地址是按值传递的,因此对于调用者而言它将保持不变。因此你可能会遇到这样的问题:
int *p = malloc( sizeof *p );
*p = 1;
free( p );
...
if( p )
*p = 2; // Undefined Behaviour!!! although p is free()'d it's still != NULL
所以你会经常发现
free( p );
p = NULL;
尽管如此,在我看来,编写一个类似 free()
的函数是可以的,只要函数的描述清楚地表明指针不能 之后使用(无论可能是什么类型的指针)。但是,当然你可以自由地用双指针定义函数,并将你有 free()'d 的所有内容设置为 NULL
,就像这个非常简单的例子一样:
void myfree( void **pp )
{
free( *p );
*p = NULL;
}
...
int *p = malloc( sizeof *p );
...
myfree( &p );
// now p == NULL
关于c - 对函数内部的自由指针有点困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29218271/
这是我正在调试的函数: boolean adin_memory(char* buffer, int size_chunck, int end_flag){ global_buffer = my
我正在尝试为具有自由 float 底座的机器人计算末端执行器空间速度雅可比行列式。由于自由 float 基数,雅可比应该包含一个基数组件和一个操纵器注释(参见 https://spart.readth
procedure FreeListObjects( l : TStrings); var i : integer; BEGIN FOR i := 0 TO l.Count -1 DO BEG
我正在探索 Haskell 中的选项,这些选项可以让我将业务逻辑与底层系统的技术实现分开。例如,在 Web 服务器的上下文中,将 Web 服务器处理其接收的信息的方式与其读取和写入数据库的方式分开。要
我的目标是使用来自 ActiveMQ 的 WebSphere Liberty Appserver(完整的 Java EE 标准)使用消息。不幸的是,我不知道如何配置 WebSphere Liberty
我以这种方式分配了一个非方阵,但我不确定我是否正确使用了释放 float **matrix_alloc(int m /* rows */, int n /* columns */) { int
我在阅读 refuting the notion 之后的第 13.5 节内置运算符不参与重载决议,并注意到没有关于 operator->* 的部分。它只是一个通用的二元运算符。 它的兄弟operato
我正在尝试使用 Libelf 库来获取有关某些 elf 文件的一些信息。但我不断收到这些“对 [...] 的 undefined reference ”。我从 synaptic 安装了 libelf(
我有创建动态结构数组的波纹管代码。 #include #include #include typedef struct { int flag; char* ip; } ip_mo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我正在用 C 编写一个程序,我需要读入一个文件并打印出每个至少 4 个字符长的字符串。我在分配要使用的内存时遇到问题。字符串可以任意长。我试图将缓冲区分配给文件的大小,然后在最后释放它,但我显然错过了
我尝试用 C 语言编写 ls 命令,但 -R 选项有问题。 输出: /Applications/Atom.app/Contents/Resources/app/apm/node_modules/es5
我正在编写一个 shell,但在执行内存检查时遇到问题,因为 valgrind 无法正常运行。 我遇到了这样的错误(我自己杀死了它): ==19703== Memcheck, a memory err
我有这样一段代码: void *write_parallel(void *num_for_chunk) { struct rusage *sum = (struct rusage*) mall
当使用包含 200-300 个整数(以空格分隔)的输入 .txt 文件运行此代码时,我在使用 fprintf 语句的 for 循环之前收到错误。 我不确定 qsort 是否导致了此错误或为什么会发生此
我试图告诉 Websphere Liberty 我的 log4j2.xml 文件在哪里,但它不起作用。 在我的文件 jvm.options 中,我配置: -Dlog4j.configurationFi
从 websphere liberty 16 迁移到 19.0.0.1 我遇到以下异常:运行存储过程后关闭连接,出现以下异常: EJB threw an unexpected (non-declare
当对大小为 210*8 的种子数据集运行此代码时,我在预测函数中的 qsort() 行之后收到错误。它不在 qsort() 之后执行。 我不确定 qsort 是否导致了此错误或为什么会发生此错误,但如
这个问题已经有答案了: Facing an error "*** glibc detected *** free(): invalid next size (fast)" (2 个回答) 已关闭 9
我是一名优秀的程序员,十分优秀!