存储char指针然后稍后填充它

时间:2014-04-14 10:56:18

标签: c++ pointers char void strcpy

我在这里遇到一个小问题,所以我将一个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;
};

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

感谢您的时间。

3 个答案:

答案 0 :(得分:4)

如果char result[255]的范围不再是&#34; alive&#34;,则这是未定义的行为。您需要使用new来分配堆内存,或使其成为static

答案 1 :(得分:1)

您的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[](来自)分配字符串内存,则在作用域结束大括号}之后,此内存仍然可用。当您在指针上调用delete[]时,将释放内存。

答案 2 :(得分:0)

在这段代码中:

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

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