繁体   English   中英

存储char指针,然后在以后填充它

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM