返回作为结构的字符*时出现问题

Issue with returning a char* which is a struct

本文关键字:问题 字符 结构 返回      更新时间:2023-10-16

我是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 

如何返回类中有关结构的所有内容?

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

此行应为:

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

因为您有 将ptr转换为int *,这+1意味着将指针移动到下一个 4 个字节(int 的大小为 4)。

你的代码有严重的问题。如果它真的有效,它只是偶然起作用。

  1. 无论是strncpy还是memset使用它都无关紧要,因为您将单位化指针传递给写入它的函数:

    char* ptr;
    t.readx(ptr);
    

    ptr指向哪里?它几乎可以指向任何地方,将其用作目标memcpy是不可预测的。如果你不是很倒霉,你会得到一个段错误/访问冲突。

  2. 你的readx方法做了一些疯狂的事情:

    char* str2 = new char[sizeof(pair)+1];
    str2 = reinterpret_cast<char*>(pir);
    

    在这里,您首先分配一些存储并将其地址分配给str2然后将其重新分配给pir地址。您永远无法delete[]new[]分配的内存,因此引入了内存泄漏。

  3. test的构造函数使用new分配内存,但您没有相应的析构函数调用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类,您将添加如下内容:

#include <algorithm>
class test
{
//...
test(test const& other) : pir{ new pair() }
{
pir->a = other.pir->a;
pir->b = other.pir->b;
}
test& operator=(test const& other)
{
test copy(other);
swap(*this, copy);
return *this;
}
test(test&& other) noexcept : pir{ nullptr }
{
swap(*this, other);
}
test& operator=(test&& other) noexcept
{
swap(*this, other);
return *this;
}
friend void swap(test& lhs, test& rhs)
{
std::swap(lhs.pir, rhs.pir);
}
};

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

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

那应该让你b。