返回作为结构的char*时出现问题 < P> >我是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; }
如何返回类中关于struct的所有内容?返回作为结构的char*时出现问题 < P> >我是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; },c++,struct,char,C++,Struct,Char,如何返回类中关于struct的所有内容?coutcout您正在将int指针递增4。这表示前面有4个整数。那不是你想要的 cout<<*((int*)ptr+4)<<endl; cout<<*((int*)ptr+1)<<endl; #include <iostream> #include <cstring> using namespace std; class test { public: struct pa
coutcout您正在将int指针递增4。这表示前面有4个整数。那不是你想要的
cout<<*((int*)ptr+4)<<endl;
cout<<*((int*)ptr+1)<<endl;
#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;
}
cout您正在将int指针递增4。这表示前面有4个整数。那不是你想要的
cout<<*((int*)ptr+1)<<endl;
#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;
}
cout您的代码有严重问题。如果它真的起作用,那只是偶然的
无论是strncpy
还是memset
您都可以使用它,这并不重要,因为您正在向写入它的函数传递单元化指针:
char* ptr;
t.readx(ptr);
ptr
指向哪里?它几乎可以指向任何地方,将其用作memcpy
目标是不可预测的。如果你不是很不走运,你会得到一个segfault/access违规
您的readx
方法做了一些疯狂的事情:
char* str2 = new char[sizeof(pair)+1];
str2 = reinterpret_cast<char*>(pir);
当您理解了基本问题时,您的代码已经阅读了关于五的规则。对于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);
}
};
#包括
课堂测试
{
//...
test(test const&other):pir{new pair()}
{
pir->a=其他。pir->a;
pir->b=其他。pir->b;
}
测试和运算符=(测试常量和其他)
{
测试副本(其他);
掉期(*本,副本);
归还*这个;
}
测试(测试和其他)无例外:pir{nullptr}
{
掉期(*本,其他);
}
测试和运算符=(测试和其他)无例外
{
掉期(*本,其他);
归还*这个;
}
朋友无效交换(测试和左侧、测试和右侧)
{
标准:互换(左S.pir、右S.pir);
}
};
您的代码存在严重问题。如果它真的起作用,那只是偶然的
无论是strncpy
还是memset
您都可以使用它,这并不重要,因为您正在向写入它的函数传递单元化指针:
char* ptr;
t.readx(ptr);
ptr
指向哪里?它几乎可以指向任何地方,将其用作memcpy
目标是不可预测的。如果你不是很不走运,你会得到一个segfault/access违规
您的readx
方法做了一些疯狂的事情:
char* str2 = new char[sizeof(pair)+1];
str2 = reinterpret_cast<char*>(pir);
当您理解了基本问题时,您的代码已经阅读了关于五的规则。对于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);
}
};
#包括
课堂测试
{
//...
test(test const&other):pir{new pair()}
{
pir->a=其他。pir->a;
pir->b=其他。pir->b;
}
测试和运算符=(测试常量和其他)
{
测试副本(其他);
掉期(*本,副本);
归还*这个;
}
测试(测试和其他)无例外:pir{nullptr}
{
掉期(*本,其他);
}
测试和运算符=(测试和其他)无例外
{
掉期(*本,其他);
归还*这个;
}
朋友无效交换(测试和左侧、测试和右侧)
{
标准:互换(左S.pir、右S.pir);
}
};
strncpy()
用于复制以NUL结尾的字符串。试着改用memcpy()
。@MikeCAT我刚试过memcpy()
,但它似乎也不起作用。再加上memcpy和+1的变化,它真的起作用了!非常感谢strncpy()
用于复制以NUL结尾的字符串。试着改用memcpy()
。@MikeCAT我刚试过memcpy()
,但它似乎也不起作用。再加上memcpy和+1的变化,它真的起作用了!谢谢!!结合使用memcpy
和+1
进行的更改,它真的很有效!谢谢!!结合使用memcpy
和+1
进行的更改,它真的很有效!谢谢!!别忘了3的规则(或是C++11之后的5)。@O'Neil添加了一些与5的规则相关的代码。我从来没有期待过更好的答案!非常感谢您的详细介绍,尽管我对最后一部分中的代码仍然感到困惑。我马上查一查五的规则。再次感谢您的帮助!别忘了3的规则(或是C++11之后的5)。@O'Neil添加了一些与5的规则相关的代码。我从来没有期待过更好的答案!非常感谢您的详细介绍,尽管我对最后一部分中的代码仍然感到困惑。我马上查一查五的规则。再次感谢您的帮助!