[英]Storing char pointers then fill it later on
我在这里有一个小问题,因此我将char指针(而不是array)存储在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;
};
结果不会超出范围,因为所有功能都在一个函数中执行。
感谢您的时间。
如果具有char result[255]
的作用域不再“有效”,则这是未定义的行为。 您需要使用new
来分配堆内存,或使其变为static
。
您的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样式强制转换。
您的堆栈分配缓冲区char result[255]
在于,当变量超出范围时,它将被销毁。 相反,如果您使用new[]
(从堆中 )分配字符串内存,则该内存在作用域大括号}
之后仍然可用。 当您在指针上调用delete[]
时,内存将被释放。
在这段代码中:
char result[255];
CEVariable result_var(CEType::string, result);
如果变量result
在某些函数中是局部变量,那么您需要确保不在此函数范围之外时不要使用变量result_var
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.