调用函数以在c中的另一个函数调用中返回字符串

时间:2018-09-07 16:55:35

标签: c optimization return-value function-call

我目前正在与来自听众的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;
     }

2 个答案:

答案 0 :(得分:2)

您的get_value_by_key函数已损坏-它正在返回一个指向局部变量(value)的指针,该局部变量在函数返回时被破坏。因此,当您尝试读取字符串时,您会得到不确定的行为-它可能仍然存在,但是可能已被其他内容覆盖。

答案 1 :(得分:1)

这似乎是一个错误:

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));

您正在将数据复制到value1value2中,但尚未为字符串分配内存,仅为指针和char分配了内存。注意:只有value1char*,而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的代码。

我敢打赌它使用静态缓冲区来保存返回指针的字符串/字符数组。那将意味着内容在第二次调用后被销毁,这可能是一个问题。

EDIT2:

如果这确实是真正的来源,那么您将返回一个指向堆栈中分配的内容的指针-严格来说是僵尸!!

请参见returning a local variable from function in C