【问题标题】:C++ struct values lostC++ 结构值丢失
【发布时间】:2017-12-25 20:16:12
【问题描述】:

我有一个奇怪的问题。我在 struct 数组中分配 char[] 值,但它们丢失了: -------- 结构是这样的:

typedef struct _Settings
{
    const char* str;
    uint val;
}Settings;

------- 我是这样创建的:

int nn=10;
settings = new Settings[nn];
for (int i = 0; i < nn; i++) {
        string strr = "thisOneIs";
        strr.append(std::to_string(i));
        settings[i].str = strr.c_str();
        string teststr = settings[i].str;   //// (1)
        settings[i].val = i + 1;
}

..... 在 (1) 处,我得到了正确的值。

但是如果我再调用它(同一个地方,就在上面的代码之后),settings[i].str 是空的:

for (int i = 0; i < nn; i++) {
        string teststr = settings[i].str;       ///// (2)
        std::cout << settings[i].str << "=" << settings[i].val << "\n";
    }

... 在 (2) 处,我变得空虚。

有人知道为什么吗?谢谢!

【问题讨论】:

  • strr 是一个具有自动存储时长的局部变量。它的作用域是 for 循环的代码块。退出循环后,变量不再存活,对应的指针无效。
  • const char* str 是一个指针,你将它指向在作用域结束时被销毁的临时对象,你期望什么?
  • 你是对的。但是如何将字符串值从 strr 永久复制到 settings[i].str 中?
  • @Steve: A recommended read.

标签: c++ arrays struct


【解决方案1】:

(1) 处的行是一个问题,因为您正在存储指向某个内存的指针,该指针在循环结束时无效。

string strr = "thisOneIs";      // A temporary object in the loop.
strr.append(std::to_string(i));
settings[i].str = strr.c_str(); // Pointer that won't be valid when the loop ends.

如果您了解低级语言功能,可以尝试使用char* 和原始内存。如果你想获得一个工作程序,只需使用std::string

同时简化Settings的定义。您不需要 C++ 中的所有 typedef 废话。

struct Settings
{
    std::string str;
    uint val;
};

【讨论】:

  • 谢谢!不幸的是,我必须将此 typedef 用于设置——它用于与旧版软件交互(使用此类东西调用 .dll 函数)。如何将字符串值从 strr 复制到 settings[i].str 中,而不仅仅是指针?
  • @Steve,您必须复制该字符串。在网上查找strdup
  • char * strdup(const char str1);重复str1。但就我而言,我有一个字符串:strr.此字符串中的任何内容都必须放入结构中的 const char str 中: settings[i].str ... 所以问题是:如何将字符串复制到 const char* 中?对不起,如果我误解了..
  • 使用settings[i].str = strdup(strr.c_str());
  • 不错!这就是解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多