【问题标题】:Storing char pointers then fill it later on存储 char 指针,然后稍后填充
【发布时间】:2014-05-28 07:22:38
【问题描述】:

我在这里遇到了一个小问题,所以我将一个 char 指针(而不是一个数组)存储在一个 void 指针中,如下所示:

char result[255];
CEVariable result_var(CEType::string, result);

现在 result_var 然后被传递给我的引擎,存储为指针,然后访问变量结构:(m_pData 是一个 void*,指向 char 数组)

strcpy((char*)pVar->m_pData, "42");

但是没有数据写入它,我确定它指向结果数组,因为我检查了地址。也许我对 void 指针的理解有误,但以下似乎可行:(只是测试)

    char dest[255];
    void*ptr = dest;
    strcpy((char*)ptr, "asdsa");
    std::cout << dest;

结果数组变成了不可读的格式,很可能是随机内存。也许从来没有写过。我的问题是问题可能是什么?

编辑:CEVariable::

class CEVariable
{
public:
    CEVariable() {}
    CEVariable(CEType t, void* mem)
    {
        m_Type = t;
        m_pData = mem;
    }

    // Variable Type
    CEType m_Type;

    // Variable Data Ptr
    void* m_pData;
};

结果不会超出范围,因为所有内容都在一个函数中执行。

感谢您的宝贵时间。

【问题讨论】:

  • CEVariable 看起来如何?构造函数是做什么的?你的 char result[255] 看起来像一个局部变量,所以它会在块的末尾超出范围。
  • strcpy((char*)pVar-&gt;m_pData, "42"); 与初始定义有何关系?
  • 另外,你如何将result_var 传递到你存储它的地方?你关注rule of three?您在需要时进行深度复制?
  • 所有这些问题(我的和其他问题)的最佳答案是创建一个Minimal, Complete, and Verifiable example 并向我们展示。
  • 查看已编辑的帖子,我已经解决了它,并且所有内容都在 main 函数中完成,所以任何内容都不应超出范围。

标签: c++ pointers char void strcpy


【解决方案1】:

如果具有char result[255] 的范围不再“活动”,则这是未定义的行为。需要使用new来分配堆内存,或者设为static

【讨论】:

  • 数组应该仍然是“活动的”,因为所有内容都在一个函数中执行。
【解决方案2】:

您的CEVariable::m_pData 只是一个指针。它没有为字符串保留空间。

您应该首先为字符串分配一些内存(例如使用new[]),然后将源字符串strcpy() 分配到该保留空间:

// Dynamically allocate some memory with new[].
// For the string "42", it's 3 chars: '4', '2' and terminating NUL '\0'.
// For a generic string, you may want to use strlen(s)+1.
pVar->m_pData = new char[3];

// Copy string
strcpy(static_cast<char*>(pVar->m_pData), "42");

// Don't forget to release the string memory with delete[]
// when it's no longer needed.
// (e.g. in CEVariable's destructor.)

请注意,在 C++ 中,您应该使用 C++ 风格的转换而不是 C 风格的转换。

stack-allocated 缓冲区char result[255] 的问题在于,当变量超出范围时,它将被销毁。相反,如果您使用new[](来自heap)分配字符串内存,则此内存在作用域结束大括号} 之后仍然可用。当您在指针上调用delete[] 时,内存将被释放。

【讨论】:

    【解决方案3】:

    在这段代码中:

    char result[255];
    CEVariable result_var(CEType::string, result);
    

    如果变量result是某个函数中的局部变量,那么你需要确保一旦你在这个函数的作用域之外就不要使用变量result_var

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2019-07-04
      • 2019-05-31
      相关资源
      最近更新 更多