【问题标题】:C : Value escapes local scope?C : 值超出本地范围?
【发布时间】:2018-05-11 04:57:13
【问题描述】:

所以我有以下 toString 函数:

/*
 * Function: toString
 * Description: traduces transaction to a readable format
 * Returns: string representing transaction
 */

 char* toString(Transaction* transaction){
    char transactStr[70];

    char id[10];
    itoa(transaction -> idTransaction,id, 10);
    strcat(transactStr, id);

    strcat(transactStr, "\t");

    char date[15];
    strftime(date,14,"%d/%m/%Y %H:%M:%S",transaction -> date);
    strcat(transactStr, date);

    strcat(transactStr, "\t");

    char amount[10];
    sprintf(amount,"%g",transaction -> amount);
    strcat(transactStr,"$ ");
    strcat(transactStr, amount);

    return transactStr;
}

CLion 用警告高亮返回行:Value escapes local scope(指transactStr)

我需要知道为什么会这样(我是 C 新手,顺便说一句)

【问题讨论】:

  • 您正在返回一个(指向)local 变量的(指针)。这可能会导致(并且可能会导致)未定义的行为,因为一旦函数结束,该值将“消失”。要么使用 malloc() 分配缓冲区,要么更改函数以接受缓冲区并填充它。您也没有将缓冲区初始化为至少一个 0。
  • 你没有初始化transactStr,所以你的第一个strcat()应该是strcpy()。

标签: c clion


【解决方案1】:

您已经在该函数中定义了一个局部变量指针(编辑感谢)并试图返回它。

这是一个禁忌,因为变量的生命周期只是它的封闭范围,这里是函数调用。如果幸运的话,任何试图引用返回值的人都会触发未定义的行为,通常是崩溃。

如果要返回数组,则需要将其作为参数传入。

【讨论】:

  • 返回一个局部变量就可以了,这是按值发生的。问题是将 pointer 返回到局部变量。
  • 正确,我会解决的。
  • @RonThompson 完美!我已经解决了这个问题。但是,话虽如此,一旦我将缓冲区作为参数传递,我是否也应该返回它?以 strcpy() 为例,它修改了存储在 char[] 中的值而我没有收到它,因为它在内存中占据了相同的位置。
  • 在这种情况下,您可以将函数重新定义为 void,也可以将返回值用作错误条件(如果您需要编写任何函数)。
  • 就像在这种情况下,如果您无法将事务转换为字符串,您可以返回一个标记值,调用者可以在尝试处理该字符串之前检查该值。
猜你喜欢
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2022-06-14
  • 2022-11-26
  • 2012-12-24
  • 2012-04-28
相关资源
最近更新 更多