gpt4 book ai didi

C/Glib 内存管理 {没有悬挂引用 > 为什么!??}

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:47 24 4
gpt4 key购买 nike

我有一个程序调用带有未定义参数的函数,如下所示:

#include <stdargs.h><br/>
... /* code */
int main () { <br/>
GArray *garray = g_array_new (FALSE, FALSE, sizeof (char *));
/* the code above initialize the GArray, and say that the garray expect a pointer to char. */<br/>
function_name (garray, "arg2", "arg3" /* and so on ... */);<br/>
... /* code */
}

请注意,""之间的参数是字符串,因此,在 function_name 中:

static void function_name (GArray *garray, ...) {
... /* code */
char *data;<br/>
data = va_arg (garray, gchar *);
g_array_append_val (garray, data);<br/>
... /* code */
}

因此,如果数据指向 va_list 中的参数,当函数返回时,从理论上讲,指向的数据将变为无效,在 garray 中也是如此。
(造成悬空引用,因为数据指针,指向一个没有保留更多的内存地址)。

但它似乎没有发生,程序运行良好。为什么?而且,在 C 中,传递给函数的参数存储在堆栈中,因此,堆栈中的数据点确实是内存?

非常感谢。

最佳答案

当您在 C 程序中引入字符串常量时,将创建一个未命名的、不可修改的、具有静态存储持续时间的对象。 “静态存储时长”是指它在程序的生命周期内一直存在。

所以当你的代码中有这个时:

function_name (garray, "arg2", "arg3" /* and so on ... */);

字符串“arg2”和“arg3”是字符串常量 - 它们存在于程序内存中的某处,在程序的生命周期内。这些通常存储在文本段中,就像程序代码本身一样。

实际传递给 function_name() 的东西——大概在堆栈上——是指向那些字符串常量的指针。这就是您的 GArray 最终存储的内容 - 指向那些字符串常量的指针。

(请注意,用作数组初始化程序的字符串不是字符串常量)。

关于C/Glib 内存管理 {没有悬挂引用 > 为什么!??},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1231114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com