我在这里遇到一个小问题,所以我将一个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;
};
结果不会超出范围,因为所有内容都在一个函数中执行。
感谢您的时间。
答案 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
这个功能。