为什么函数sizeof
在struct
本身使用时不会返回相同的大小?
我需要施放它,因为我正在努力的winsock程序。 谢谢你的帮助,真的。
#include <iostream>
#include <string>
using namespace std;
struct stringstruct
{
string s1;
string s2;
};
int main()
{
stringstruct ss = {"123","abc"};
char *NX = (char*)&ss;
cout << sizeof(NX) << endl << sizeof(*NX) << endl;
cout << sizeof(&ss) << endl << sizeof(ss) << endl;
getchar();
return 0;
}
以上示例输出
4
1
4
64
答案 0 :(得分:6)
sizeof
将告诉您给定表达式类型的大小。在sizeof(NX)
和sizeof(&ss)
中,结果为4,因为计算机上的指针占用4个字节。对于sizeof(*NX)
,您取消引用char*
,它会为您提供char
,而char
占用1个字节(并且始终为1),因此您可以获得输出1 。sizeof(ss)
时,ss
为stringstruct
,因此您获得的stringstruct
大小似乎是64字节。
答案 1 :(得分:2)
stringstruct ss = {"123","abc"};
char *NX = (char*)&ss;
cout << sizeof(NX) << endl << sizeof(*NX) << endl;
cout << sizeof(&ss) << endl << sizeof(ss) << endl;
我很确定这些演员阵容都毫无意义。 NX
将指向结构的开头。结构内部是两个string
类型的对象,它们的指针又指向分别用"123"
和"abc"
初始化的数据。 sizeof(*NX)
只是char
的大小,而sizeof(NX)
确实是指针的大小。 sizeof(ss)
是两个字符串成员的大小(以及编译器添加的任何填充) - sizeof(&ss)
是指向stringstruct的指针的大小。
现在,我希望您真正想要的是通过网络将数据"123"
和"abc"
作为两个单独的字符串发送的方式。以上都不能帮助您实现这一点,因为即使sizeof(ss)
给出了您要发送的数据结构的大小,字符串值也不在该结构中[1]。你真正需要的是调用序列化的东西 - 把你的字符串写成文本/字符串的单独元素。
这样的事情会起作用:
struct stringstruct {
string s1;
string s2;
string to_string()
}
string stringstruct::to_string()
{
string res = s1 + " " + s2;
return res;
}
然后像这样使用to_string
:
string temp = ss.to_string();
const char *to_send = temp.c_str();
int send_len = temp.length();
... send the string `to_send` with number of bytes `send_len`.
[1]有一种优化,其中std::string
实际上是在实际类本身中存储短字符串。但考虑到足够长的强者,它不会那样做。
答案 2 :(得分:0)
指针的大小为4(在你的情况下似乎是32位),无论它指向什么。另一方面,对象本身的大小返回该结构的对象占用的实际字节数。