【问题标题】:Returning C style string from function C++ [duplicate]从函数 C++ 返回 C 样式字符串 [重复]
【发布时间】:2021-05-19 11:05:02
【问题描述】:

我想从一个函数返回一个 C 风格的字符串。我找到了这个解决方案: Solution

const char* myName() {
  char *name = "Flavio";
  return name;
}

但是我不明白这是如何工作的。为什么 c 字符串超出范围时不会被破坏?在这种情况下堆是如何工作的?对函数的连续调用会在堆上分配越来越多的内存;导致内存泄漏?字符串是如何从堆中清除的?

谢谢。

【问题讨论】:

  • 您发现的“解决方案”的用途相当有限。该教程并没有完全错误,但它具有很大的误导性
  • 请在帖子中提供代码,而不是图片链接
  • 连续调用函数会在堆上分配越来越多的内存;导致内存泄漏? 在呈现的情况下,没有分配内存。您正在返回一个指向字符串文字的指针。
  • 我建议不要在尝试学习 C++ 时使用 C 教程。 C 和 C++ 是不同的语言,一种语言的事实和良好习惯通常不适用于另一种语言。编辑:关于您的编辑,这说明了我的观点。 char *name = "Flavio"; 在 C 中是允许的,但在 C++ 11 之后不允许在 C++ 中。你需要 C++ 中的const char *name = "Flavio";
  • 字符串如何从堆中清除?字符串不在堆中。

标签: c++ c string


【解决方案1】:

其实你的代码并不能说明你的问题。

您的代码的固定版本:

const char* myName() {
  const char *name = "Flavio";    // name is just a pointer to a literal
  return name;
}

这里你只返回一个指向字符串的指针:在任何地方都没有分配没有悬空指针

我从你的问题中了解到:

char* myName() {
  char name[] = "Flavio";        // name is an automatic array here
  return name;                   // Oops: dangling pointer
}

这里的name 是一个动态数组初始化 来自文字的内容。每次调用都会有一个新对象出现,并在函数返回时结束生命。调用者得到一个指向 dead 对象的指针(一个 dangling 指针)并使用它调用未定义的行为。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2016-07-13
    • 2014-11-06
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多