我有一个程序调用具有未定义参数的函数,如下所示:
#include <stdargs.h>
... /* code */
int main () {
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. */
function_name (garray, "arg2", "arg3" /* and so on ... */);
... /* code */
}
Run Code Online (Sandbox Code Playgroud)
请注意,""之间的参数是字符串,因此,在function_name中:
static void function_name (GArray *garray, ...) {
... /* code */
char *data;
data = va_arg (garray, gchar *);
g_array_append_val (garray, data);
... /* code */
}Run Code Online (Sandbox Code Playgroud)
因此,如果数据指向va_list中的参数,则当函数返回时,指向的数据将逐步变为无效,并且也会变为garray.
(导致悬空引用,因为数据指针,指向内存地址不保留更多).
但它似乎没有发生,程序运行良好.为什么?并且,在C中,传递给函数的参数存储在堆栈中,那么,数据点生存在堆栈中的确是内存吗?
thnkx很多.
在C程序中引入字符串常量时,会创建一个具有静态存储持续时间的未命名,不可修改的对象."静态存储持续时间"意味着它适用于程序的生命周期.
所以当你的代码中有这个:
function_name (garray, "arg2", "arg3" /* and so on ... */);
Run Code Online (Sandbox Code Playgroud)
字符串"arg2"和"arg3"是字符串常量 - 它们存在于程序存储器的某个地方,用于程序的生命周期.它们通常以与程序代码本身相同的方式存储在文本段中.
实际传递给function_name()的内容 - 可能是在堆栈上 - 是指向那些字符串常量的指针.这就是你的GArray最终存储的内容 - 指向那些字符串常量的指针.
(注意,用作数组初始化器的字符串不是字符串常量).