C 节点v8变量默认为NULL,但根据传递的参数重新分配

C 节点v8变量默认为NULL,但根据传递的参数重新分配,c,v8,C,V8,我确信这是非常基本的,但我还没有找到类似的东西(也许我完全走错了方向)。。我试图将str传递给“call_to_c_lib_func”函数,该函数接受NULL或字符串(char*) #包括 #包括 #包括 无效测试(constv8::FunctionCallbackInfo和args){ char*str=NULL; 如果(!args[3]->IsNull()&&!args[3]->IsUndefined()){ 字符串::Utf8Value arg_str(args[3]->ToString(

我确信这是非常基本的,但我还没有找到类似的东西(也许我完全走错了方向)。。我试图将str传递给“call_to_c_lib_func”函数,该函数接受NULL或字符串(char*)

#包括
#包括
#包括
无效测试(constv8::FunctionCallbackInfo和args){
char*str=NULL;
如果(!args[3]->IsNull()&&!args[3]->IsUndefined()){
字符串::Utf8Value arg_str(args[3]->ToString());
str=*arg_str;
}
//以下函数接受NULL或char*
调用_到_c_lib_func(str);
}

编辑:这篇文章最初包含了这方面的简化C代码,这并没有真正帮助解释问题,希望这能澄清一点。

你的文章没有提出问题,也没有解释你在代码方面遇到了什么问题。因此,我假设您完全按照发布的方式运行代码,有时对函数的调用行为异常或崩溃


您的现有代码失败,原因是:

String::Utf8Value arg_str(args[3]->ToString());
位于
{
代码块
}
内,但您尝试在该代码块退出后(因此在
arg_str
被销毁后)访问其内容

相反,你可以写:

String::Utf8Value temp;
char *str = NULL;

if (!args[3]->IsNull() && !args[3]->IsUndefined())
{
    temp = args[3]->ToString();
    str = *temp;
}

call_to_c_lib_func( str );
当然,剥猫皮的方法有很多,但在使用
v8::String
时,请注意不要在销毁字符串后使用
运算符*
的结果,因为它返回一个指向字符串内容的指针


注意。我不熟悉V8,因此可能有一种更优雅的方式来访问
args[3]
的字符串数据,我们两人都不知道。

我想你忘了问一个实际问题了!另外,使用strlen和strncpy并不比strcpy更安全;字符串的长度是从它自身的数据推断出来的,可能是也可能不是以零结尾的C字符串,不会导致或导致不应该复制的数据的复制。您仍然没有提出问题或解释您遇到的问题。谢谢,这确实解释了它。然而,我想知道如果有多个参数(当然没有使用大量嵌套的if语句),它是如何构造的?那么,复制字符串值以便在if块之外访问它是否明智?@gratz已经更新了代码,以避免重复库调用。关键的一点是,当指向其内容的指针处于活动状态时,
String::Utf8Value
对象必须仍然存在。似乎无法声明“String::Utf8Value temp;”在另一行上分配给它,因此我改为:“String::Utf8Value temp(args[3]->ToString());”后跟包含“str=*temp;”的if块。似乎不太正确,因为在检查字符串是否为null或未定义之前,我正在转换为字符串,但它似乎工作正常。。谢谢
String::Utf8Value temp;
char *str = NULL;

if (!args[3]->IsNull() && !args[3]->IsUndefined())
{
    temp = args[3]->ToString();
    str = *temp;
}

call_to_c_lib_func( str );