string数组做参数问题,形、实参数sizeof()返回结果有差异;string数组“元素个数”计算等问题

秋的红果实 2017-07-23 06:56:07
本来是想建个简单的单链表,结果出现了标题所示问题,具体问题在代码解说里

struct Node
{
string Data;
Node *next;
};
Node* createLinkNode(string dataArr[])
{
Node *preNode=NULL, *currNode=NULL;
int Max = 7;// sizeof(dataArr) / sizeof(dataArr[0]) - 1;
cout << sizeof(dataArr) << endl << sizeof(dataArr[0]) << endl; //这里输出4和24,为什么总字节数是4?应该是192
system("pause");

for (int i = Max; i >=0; i--)
{
currNode = new Node();
currNode->Data = dataArr[i];
if (i == Max)
{
currNode->next = NULL;
}
else
{
currNode->next = preNode;
}
preNode = currNode;

}

return currNode;

}

int _tmain(int argc, _TCHAR* argv[])
{
string ele[] = { "D1", "D2", "D3", "D4", "D5", "D6", "D7","D8" };

cout << sizeof(ele) << endl << sizeof(ele[0]) << endl; //这里输出192和24
system("pause");

Node *n = createLinkNode(ele);
while (n != NULL)
{
cout << n->Data << endl;
n = n->next;

}
system("pause");

……
}

问题较多,是新手,请多包涵
(1)如代码注解所述,函数createLinkNode里面,sizeof(dataArr)为什么是4字节,而主函数里却是192?
(2)sizeof(dataArr) / sizeof(dataArr[0]) ,在string数组中,计算实际元素个数是不是可靠?有没有算错的时候
(3)string Arr[]方式,比用char Arr[][MaxLength],是不是更能有效利用存储空间?
(4)sizeof(dataArr[0]) 为24,是怎么来的?既然是根据数组中“字符串元素”长度平均计算的,那么我的数据D1,D2,D3……,一个也不至于占用24字节
(5)我的问题里,如何解决链表节点个数问题,不想再增加一个参数
...全文
172 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2017-07-25
  • 打赏
  • 举报
回复
引用 6 楼 pkxpp 的回复:
cout << sizeof(ele) << endl << sizeof(ele[0]) << endl; //这里输出192和24
还有这个写法,我服你!
???
上山老人 2017-07-24
  • 打赏
  • 举报
回复
cout << sizeof(ele) << endl << sizeof(ele[0]) << endl; //这里输出192和24
还有这个写法,我服你!
秋的红果实 2017-07-24
  • 打赏
  • 举报
回复
自己顶起来……
战在春秋 2017-07-23
  • 打赏
  • 举报
回复
引用
单位应该是字节吧
是的,我误写了。谢谢
秋的红果实 2017-07-23
  • 打赏
  • 举报
回复
引用 1 楼 fight_in_dl 的回复:
第四个问题原因是每个字符占8个字节,"D1"包括3个字符 'D' '1' '\0' ,结果为24。注意字符串隐含'\0'作为结束字符。
sizeof()返回结果的单位应该是字节吧, 'D' '1' '\0' 是3字节(byte),占24个位(Bit)
「已注销」 2017-07-23
  • 打赏
  • 举报
回复
1. 数组变指针,一个是数组的大小,一个是指针的大小。 2. sizeof(dataArr[0]) 和sizeof(string)的含义是一样的,给出的结果都是类型string的大小。这个大小与string的实现有关,在现在的主流编译器中都是32。计算数组的长度可以用 数组内存/数据类型内存,这样计算没有问题。 3. 对于数据量比较大的地方,不推荐使用char[MaxLength]来保存字符串,太耗内存。如果数据量很小,并且对性能有要求,可以这么写,分配了一块大内存,这是内存换时间的写法。 4. 在2中说过了,这是string类型的大小,与类的实现有关,具体查阅class的sizeof是怎么计算的。 5. 可以创建一个class List,包含node的头尾节点和list的size,并封装增减节点的操作,node数量有增减的时候更新size的大小。题主感兴趣可以看一下std::list的实现。
战在春秋 2017-07-23
  • 打赏
  • 举报
回复
引用
问题较多
第一个问题是数组作为参数时退化成指针造成的。 详细可参考: http://blog.sina.com.cn/s/blog_4c4d6e740102w4qc.html 第二个问题答案是可靠,实际上这就是计算数组长度的标准方法 第四个问题原因是每个字符占8个字节,"D1"包括3个字符 'D' '1' '\0' ,结果为24。注意字符串隐含'\0'作为结束字符。 第三和第五个问题不知道。 希望对你有帮助 ,结题时按我回答的问题数所占比例给分就行^_^

64,646

社区成员

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

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