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

问题描述 投票:-2回答:2

我目前正在与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;
     }
c optimization return-value function-call
2个回答
2
投票

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


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,但您没有为字符串分配内存 - 只是指针和字符。注意:只有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的代码。

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

Aaditi:

如果那确实是真正的来源,那么你将返回一个指向堆栈上分配的东西的指针 - 严格的verboten !!

returning a local variable from function in C

© www.soinside.com 2019 - 2024. All rights reserved.