返回char *是一个结构

时间:2017-03-02 02:43:32

标签: c++ struct char

我是C ++的新手,我试图通过char *返回在类中声明的结构。

#include<iostream>
using namespace std;
#include <cstring>

class test
{
public:
    struct pair
    {
        int a,b;
    };
    test(){
        pir=new pair;
        pir->a=1;
        pir->b=2;
    }

    void readx(char* str)
    {
        char* str2=new char[sizeof(pair)+1];
        str2=reinterpret_cast<char*>(pir);
        strncpy(str,str2,sizeof(pair));
    }
private:
    pair* pir;

};

int main()
{
    test t;
    char* ptr;
    t.readx(ptr);
    cout<<*((int*)ptr)<<endl;
    cout<<*((int*)ptr+4)<<endl;
    return 0;
}

我尝试了多种方法,但仍然无法返回可以重新解释为结构的char *。实际上返回的char *只能保存第一个参数,丢失有关第二个参数的信息,尽管我已经使用了strncpy函数。此测试代码的输出是

1
0 

我如何在类中返回有关struct的所有内容?

3 个答案:

答案 0 :(得分:3)

cout<<*((int*)ptr+4)<<endl;

这一行应该是:

cout<<*((int*)ptr+1)<<endl;

因为您已将ptr转换为int *,其中+1表示将指针移至下一个4字节(int的大小为4)。

答案 1 :(得分:1)

您的代码存在严重问题。如果它真的有用,它只会偶然起作用。

  1. 您使用它是a还是strncpy并不重要,因为您将单位化指针传递给写入它的函数:

    memset

    char* ptr; t.readx(ptr); 指向哪里?它几乎可以指向任何地方并使用它作为ptr目标是不可预测的。如果你不是很不走运,你将受到段错/访问违规。

  2. 您的memcpy方法做了一些疯狂的事情:

    readx

    在这里,您首先找到一些存储空间并将其地址分配给char* str2 = new char[sizeof(pair)+1]; str2 = reinterpret_cast<char*>(pir); ,然后将其重新分配到str2的地址。 pir永远不能delete[]分配内存,因此会引入内存泄漏。

  3. new[]的构造函数使用test分配内存,但您没有相应的析构函数调用new - &gt;记忆泄漏。

  4. 然后有你的delete问题已被其他人指出。在这里,您可以找到纠正的代码,以便您可以按照自己的意愿进行操作。

    ptr+4

    当您了解代码阅读有关五条规则的基本问题时。对于#include <iostream> #include <cstring> using namespace std; class test { public: struct pair { int a, b; }; test() : pir{ new pair() } { pir->a = 1; pir->b = 2; } ~test() { delete pir; } void readx(char* str) { memcpy(str, reinterpret_cast<char*>(pir), sizeof(pair)); } private: pair* pir; }; int main() { test t; char* ptr = new char[sizeof(test::pair)]; t.readx(ptr); cout << *((int*)ptr) << endl; cout << *((int*)ptr + 1) << endl; delete[] ptr; return 0; } 类,您可以添加如下内容:

    test

答案 2 :(得分:0)

您将int指针递增4.这指向前面的4个整数。那不是你想要的。

cout<<*((int*)ptr+1)<<endl;

那应该让你b。