我目前正在与audinate的Dante Brooklyn II董事会合作开展一项计划。我试图使用Dante API中的void返回函数 - foo() - 需要传入3个不同的结构以及2个字符串。我有另一个函数get_value_by_key(),它返回我需要的字符串值。我最初尝试这样调用该程序:
foo(struct, struct, struct, get_value_by_key(key1), get_value_by_key(key2);
当我以这种方式运行时,程序会扭曲返回的get_value_by_key()字符串并使整个程序崩溃。但是,我发现了一种可行的替代方案,但它更长,我不想浪费额外的处理能力。替代方案是:
char value1[15], value2[15];
strcpy(value1, get_value_by_key(key1));
strcpy(value2, get_value_by_key(key2));
foo(struct, struct, struct, value1, value2);
我似乎无法破译为什么布鲁克林董事会用第一个命令关闭,而不是第二个命令。任何帮助都将非常感激。这是get_value_key()的代码。这里很简单的逻辑:
char * get_value_by_key(command_t command, char key[50]){
int i;
char value[50];
for(i = 0; i < NUM_PARAMETERS; i++){
if(strcmp(user_command.command_parameter[i].key, key) == 0){
strcpy(value, user_command.command_parameter[i].value);
}
}
return value;
}
你的get_value_by_key
函数被破坏 - 它返回一个指向局部变量(value
)的指针,该函数在函数返回时被销毁。因此,当您尝试读取字符串时,您会得到未定义的行为 - 它可能仍然存在但可能已被其他内容覆盖。
这看起来像是一个错误:
char * value1, value2; /* value1 is a char*, value2 is a char */
strcpy(value1, get_value_by_key(key1));
strcpy(value2, get_value_by_key(key2));
您正在将数据复制到value1
和value2
,但您没有为字符串分配内存 - 只是指针和字符。注意:只有value1
是char*
,而value2
是单个char
。如果你想宣布两个char*
,你需要写:
char *value1, *value2;
下面的代码应该不会崩溃(假设get_value_by_key()返回一个char*
),但我不知道你想如何分配空间。在堆栈,堆或静态RAM?
char value1[128], value2[128];
strcpy(value1, get_value_by_key(key1));
strcpy(value2, get_value_by_key(key2));
编辑:(在评论中的新信息后编辑)
请发布get_value_by_key
的代码。
我打赌它使用静态缓冲区来保存字符串/ char数组,它返回一个指针。这意味着内容在第二次调用后被破坏,这可能是一个问题。
Aaditi:
如果那确实是真正的来源,那么你将返回一个指向堆栈上分配的东西的指针 - 严格的verboten !!