sizeof求数组中元素个数的问题。。

wendellup 2011-04-12 10:07:36
对于内置型类型。
比如说int a[10]。
可以用sizeof(a)/sizeof(*a)求出数组中元素的个数。。

但是昨天用到字符串数组的时候出现问题了。。
string a[10];

sizeof(a)/sizeof(*a) = 4/16 =0
sizeof(a)求出的只是地址所占的内存。。

如果我想求未知字符串数组的元素个数。。。怎么求。。。
还有sizeof(a)为什吗只是求出地址所占的内存。。
...全文
919 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssbb94 2011-04-13
  • 打赏
  • 举报
回复
数组名作为参数传递给函数时,退化为指针,所以sizeof(a)=4;
你直接在主函数里求的话,sizeof(a)=160
pamtry 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sanshao1314 的回复:]

C/C++ code

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void fun(string *a)
{
cout << sizeof(a)/sizeof(string) << endl;
}
int main()
{
string a[2] = {"aaa", ……
[/Quote]

这里有一个隐藏的问题导致2者答案不一

【当数组名被作为函数参数时,就将完全等同于指针】

因此当把一个数组名传递进函数后,对其进行的sizeof操作,就相当于对指针进行的sizeof操作,当然也就无法得到数组的正确大小了
宁谧青风 2011-04-13
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;

int main()
{
string a[]= {"str", "heo", "abc"};
cout<<sizeof(a)<<endl;
cout<<sizeof(string)<<endl;
cout<<sizeof(a)/sizeof(string)<<endl;
return 0;
}

AIGPTchina 2011-04-12
  • 打赏
  • 举报
回复
fun(a); 4/4 =1
cout << sizeof(a)/sizeof(string) << endl; 8/2 =4

string a[2] 是一个指针数值,这个数组有两个元素,每个元素都是一个字符指针。

Freedom 2011-04-12
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void fun(string *a)
{
cout << sizeof(a)/sizeof(string) << endl;
}
int main()
{
string a[2] = {"aaa", "bbb"};
fun(a);
cout << sizeof(a)/sizeof(string) << endl;
return 0;

}
为什么两个输出结果不一样啊?

sysvv 2011-04-12
  • 打赏
  • 举报
回复

sizeof(array) / sizeof((array)[0])


-- 后面的 array 再打个括号,兼容比较好
sysvv 2011-04-12
  • 打赏
  • 举报
回复
试一下这样子,应该没问题:

#define numof(array) sizeof(array) / sizeof(array[0])

GoonYangXiaofang 2011-04-12
  • 打赏
  • 举报
回复

void fun(string a[])
{
cout << sizeof(a)/sizeof(string) << endl;//mark

}


传递的实际是指针,数组不会作为参数传递,所以这里 sizeof (a) = 4
wendellup 2011-04-12
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;
void fun(string a[])
{
cout << sizeof(a)/sizeof(string) << endl;//mark

}
int main()
{
string a[2] = {"aaa", "bbb"};
fun(a);
return 0;
}


上代码。。
再来看看。。
lovesi3344 2011-04-12
  • 打赏
  • 举报
回复
string a[10];

sizeof(a)/sizeof(string)
wendellup 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 goonyangxiaofang 的回复:]

你用哪个的编译器,在 vs2010 里

string a[10];
sizeof (*a) = 32
sizeof (a) = 320
sizeof (a) / sizeof (*a) = 10
[/Quote]

vc6.0
wind4905564 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wendellup 的回复:]
引用 1 楼 wind4905564 的回复:

int getNum(char m[]){
int n=0;
for (int x=0;x<100;x++)
{ if (m[x]==NULL) break;
n++;
}
return n;
}
像这样自己动手写一个 费不了多少事的

是string数组。
[/Quote]
我是说像这样的 你把char m【】改成string m【】 不就行了么~~
GoonYangXiaofang 2011-04-12
  • 打赏
  • 举报
回复
你用哪个的编译器,在 vs2010 里

string a[10];
sizeof (*a) = 32
sizeof (a) = 320
sizeof (a) / sizeof (*a) = 10
wendellup 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wind4905564 的回复:]

int getNum(char m[]){
int n=0;
for (int x=0;x<100;x++)
{ if (m[x]==NULL) break;
n++;
}
return n;
}
像这样自己动手写一个 费不了多少事的
[/Quote]
是string数组。
wind4905564 2011-04-12
  • 打赏
  • 举报
回复
初学的时候 别总想用类库里面的函数来做 得不到锻炼的 基本的东西都不会 对给的函数当然也不能够好好运用的
wind4905564 2011-04-12
  • 打赏
  • 举报
回复
int getNum(char m[]){
int n=0;
for (int x=0;x<100;x++)
{ if (m[x]==NULL) break;
n++;
}
return n;
}
像这样自己动手写一个 费不了多少事的

64,282

社区成员

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

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