2

为什么函数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
4

3 回答 3

6

sizeof将告诉您给定表达式类型的大小。在sizeof(NX)andsizeof(&ss)中,结果都是 4,因为您机器上的指针占用 4 个字节。对于sizeof(*NX),您正在取消引用 a char*,它为您提供 a char,并且 achar占用 1 个字节(并且总是如此),因此您得到输出 1。当您这样做时sizeof(ss)ss是 a stringstruct,因此您得到 a 的大小stringstruct,这似乎是64 字节。

于 2013-05-21T11:55:18.687 回答
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)只是 a的大小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实际上是在实际类本身中存储短字符串。但鉴于足够长的强度,它不会那样做。

于 2013-05-21T12:05:49.500 回答
0

无论指向什么,指针的大小都是 4(在您的情况下似乎是 32 位)。另一方面,对象本身的大小返回该结构的对象占用的实际字节数。

于 2013-05-21T11:55:53.437 回答