我是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的所有内容?
答案 0 :(得分:3)
cout<<*((int*)ptr+4)<<endl;
这一行应该是:
cout<<*((int*)ptr+1)<<endl;
因为您已将ptr
转换为int *
,其中+1
表示将指针移至下一个4字节(int的大小为4)。
答案 1 :(得分:1)
您的代码存在严重问题。如果它真的有用,它只会偶然起作用。
您使用它是a
还是strncpy
并不重要,因为您将单位化指针传递给写入它的函数:
memset
char* ptr;
t.readx(ptr);
指向哪里?它几乎可以指向任何地方并使用它作为ptr
目标是不可预测的。如果你不是很不走运,你将受到段错/访问违规。
您的memcpy
方法做了一些疯狂的事情:
readx
在这里,您首先找到一些存储空间并将其地址分配给char* str2 = new char[sizeof(pair)+1];
str2 = reinterpret_cast<char*>(pir);
,然后将其重新分配到str2
的地址。 pir
永远不能delete[]
分配内存,因此会引入内存泄漏。
类new[]
的构造函数使用test
分配内存,但您没有相应的析构函数调用new
- &gt;记忆泄漏。
然后有你的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。