【问题标题】:Why are my variable values being deleted?为什么我的变量值被删除?
【发布时间】:2019-05-27 17:56:22
【问题描述】:

我正在尝试在 C 中提取子字符串。我有一个字符串函数(char command[])的输入,并且正在取出其中的一部分。在调试我的代码时,我注意到当我到达函数的后面部分时,值(条件和累积)正在被删除。为什么是这样? (见下面的代码)

int multiply(char command[]) {
    char condition[5];
    memmove(condition, command, 4);
    condition[3] = '\0';
    char accumulate[2];
    memmove(accumulate, &command[4], 1);
    accumulate[2] = '\0';
    char set[2];
    memmove(set, &command[5], 1);
    set[2] = '\0';

    return EXIT_SUCCESS;
}

根据调试器,在定义 set 时会擦除条件,并在 EXIT_SUCCESS 时擦除累积。

【问题讨论】:

  • 你想在这里实现什么?如,您计算的子字符串应该在哪里结束?我已经回答解释发生了什么,但如果没有更多细节@Ben Dent,我无法帮助您使功能正常工作
  • accumulate[2] = '\0'; 是未定义的行为,因为它正在索引数组char accumulate[2]; 超出其范围。
  • 和char set[2]一样。

标签: c substring


【解决方案1】:

condition 在定义set 时被删除,因为在定义set 后不使用condition,因此您的编译器通过将两者存储在同一位置进行优化。

accumulate 在你从函数返回时被删除,因为它是一个局部变量。

【讨论】:

  • 我认为原因与undefined behaviour有关,而不是编译器优化或局部变量。
  • @WeatherVane 我不得不在这里不同意你的观点。即使在修复了越界写入之后,我仍然看到相同的行为。对在不同时间使用的两个变量使用相同的内存块是一种非常常见的优化,如下所示。
  • 在这种情况下,调试时应该关闭优化。当UB把事情搞砸时,我不清楚“擦除”是什么意思。
猜你喜欢
  • 2012-09-08
  • 2015-12-10
  • 2023-04-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2019-09-14
  • 1970-01-01
相关资源
最近更新 更多