一个奇怪的sizeof问题-解救小鸟...

halonar 2011-12-06 03:42:33
const char* ca[] = {
"pralines & cream",
"fudge ripple",
"wild mountain blackberry"
};
cout << sizeof(ca) << endl;
cout << sizeof(*ca) << endl;

这个很好理解,ca是一个存储指针的数据,而*ca是一个指针,所以 sizeof(*ca) = 4, sizeof(ca) = 12.
但是:
const string iceCream[] = {
"pralines & cream",
"fudge ripple",
"wild mountain blackberry"
};
cout << sizeof(iceCream) << endl;
cout << sizeof(*iceCream) << endl;

iceCream是一个存储string的数组,string的构造器直接将C-style转化为string对象。*iceCream不是string对象么,那么为什么sizeof(*iceCream) = 4, sizeof(iceCream)=12 (使用的是GCC)???? 这个和VS2008测试的结果不一样...

cout << &iceCream[0] << endl;
cout << &iceCream[1] << endl;
cout << &iceCream[2] << endl;
使用GCC,我打印了地址,的确输出是:
0x22f2f4
0x22f2f8
0x22f2fc
说明果然:iceCream[0]只是占了4个字节,但是我想知道iceCream[0]不是string对象(貌似也是一个地址),它存在哪了???
刚有同学使用VS2008测试了一下,结果不一致。

PS:
sizeof不是在编译期间就计算出来的么?那么编译期间就知道结构体/类的内存如何对齐的吗????
...全文
91 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
halonar 2011-12-06
  • 打赏
  • 举报
回复
又不是在头文件里,这个只是个测试,不用注意注意力....
[Quote=引用 6 楼 yanbo1982 的回复:]

string这个类使用时最好使用std::string的形式。
[/Quote]
饽饽 2011-12-06
  • 打赏
  • 举报
回复
string这个类使用时最好使用std::string的形式。
iamnobody 2011-12-06
  • 打赏
  • 举报
回复
string 是一个类,不同编译器的实现不一样,导致他们有不同的成员。所以sizeof也不一样。
yisikaipu 2011-12-06
  • 打赏
  • 举报
回复
string里存指针,然后重载解引用操作符/下标操作符
yisikaipu 2011-12-06
  • 打赏
  • 举报
回复
用codeblock试了,实现不一样
kklvzl 2011-12-06
  • 打赏
  • 举报
回复
不是很理解
机智的呆呆 2011-12-06
  • 打赏
  • 举报
回复
string vc和gcc的实现可能不一样

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧