返回作为结构的字符*时出现问题
Issue with returning a char* which is a struct
我是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)。
你的代码有严重的问题。如果它真的有效,它只是偶然起作用。
-
无论是
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
分配内存,但您没有相应的析构函数调用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。
相关文章:
- 从矢量C++读取字符时出现问题
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- C++理解计算字符变量的问题
- 将十六进制值设置为用于填充的字符变量时出现问题
- 编写 cin.get() 以接收字符数组时出现问题
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 字符 * 未从重载运算符或内存管理问题正确返回
- 将utf16宽std::wstring转换为utf8窄std::string以获得罕见字符时出现问题
- 我在使用字符的函数时遇到了一些问题
- 用wchar_t处理 unicode 字符好吗?它不会引起任何问题吗?
- 将 c++ 字符串转换为常量字符 * 时出现问题
- C++程序,将整数输入转换为字符的问题
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- C++ 初级面试问题:仅使用字符指针压缩字符序列的功能
- 通过比较字符设置字符串时出现问题
- 我的编辑距离递归代码中的字符类型有问题
- 获取“boost::文件系统::p ath”字符指针时出现问题
- C Unicode UTF-8解码字符的问题
- 类型转换问题:字符数组的元素转换为整数变量