sizeof()求数组长度的时候的问题???

Tevoo 2004-12-11 10:47:57
#include <iostream>
using namespace std;

void f(int* b)
{
cout <<sizeof(b);
}

int main()
{
int a[]={3,5,6,9,7};
cout <<sizeof(a)<<endl;
f(a);
return 0;
}
/* sizeof(a)的结果为20;
sizeof(b)的结果为4;
假如sizeof(b)得出的结果为20,
那么在f()函数中就可以用sizeof(b)/sizeof(int)
求出a[]数组的个数。
在f()函数中求a[]数组的个数怎么求呢?
*/

/* 这里a和b同样指的是“指针”,
咋函数这么一传,就变了呢?
那应该sizeof(a)也是4的啊,怎么就20了呢?
用的是VC++ 6.0
*/
...全文
1273 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯嘉 2005-02-16
  • 打赏
  • 举报
回复
要是sizeof保险,那就用不着“int main(int argc, char* argv)”了。
Tevoo 2004-12-12
  • 打赏
  • 举报
回复
我都不知道,怎么给分了...

我出的分太少了...

唉...
Tevoo 2004-12-12
  • 打赏
  • 举报
回复
引用:
-------------------------------------------------------
如果在你的程序里的那个数组a (int a[]={3,5,6,9,7};)的类型
换成wchar_t,sizeof a 会返回多少呢?是20
那sizeof a[0]呢?返回是2
那这下子,不就惨了?
(sizeof a)/(sizeof a[0])不就是10了?
变成比原来的数组元素个数多出一倍了
.......
--------------------------------------------------------

我试了下在VC++6.0下sizeof(a[0])也是4啊...

kisser1 2004-12-12
  • 打赏
  • 举报
回复
对于这个问题Msdn里也有讲,如下:
sizeof Operator
sizeof expression

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.

The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses).

When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. (后面这句就可以解释你的问题了)When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.
(但是,为什么不可以呢?)

For related information, see Operators.

Example

// Example of the sizeof keyword
size_t i = sizeof( int );

struct align_depends {
char c;
int i;
};
size_t size = sizeof(align_depends); // The value of size depends on
// the value set with /Zp or
// #pragma pack

int array[] = { 1, 2, 3, 4, 5 }; // sizeof( array ) is 20
// sizeof( array[0] ) is 4
size_t sizearr = // Count of items in array
sizeof( array ) / sizeof( array[0] );

对于为什么不可以,暂时我还没有个人见解.
但是,sizeof 确是一个Operator.虽然它是一个Operator,但是,并不一定就是在编译
时被确定了.

对于这个function

void f(int* b)
{
cout <<sizeof(b);
}

中的 b ,来说,b是一个指向int的变量,既然是变量,那
么sizeof b 返回的就是该变量所占内存字节的大小,
所以,你的程序返回 4 是很正常的...
如果在你的程序里的那个数组a (int a[]={3,5,6,9,7};)的类型
换成wchar_t,sizeof a 会返回多少呢?是20
那sizeof a[0]呢?返回是2
那这下子,不就惨了?
(sizeof a)/(sizeof a[0])不就是10了?
变成比原来的数组元素个数多出一倍了
.......
Tevoo 2004-12-12
  • 打赏
  • 举报
回复
struct test
{
int a[6];
}
void f(struct test)
{sizeof(test.a);
}

要达到的要求是a[]的长度是不确定的.
等在初始化的时候才确定..
int a[6]的话,把数组长度给固定了..
lyff8neo 2004-12-12
  • 打赏
  • 举报
回复
sizeof()在求字符串得时候会把后面得\0就是结束符算进去么???
「已注销」 2004-12-12
  • 打赏
  • 举报
回复
如果传入的确实是数组,则以下的方法可以却出数组的长度:
void f(int* b)
{
int c = *(b-1);
cout <<c<<endl;
}
happydivid 2004-12-12
  • 打赏
  • 举报
回复
引用:
----------------
你也可以这样引用数组的形式传递:
void f(int (&a)[3])

请问,指针可不可以通过引用方式传递啊?
如果能,请问函数该怎么样声明?
jsblcg 2004-12-12
  • 打赏
  • 举报
回复
看样子,楼主有个概念错误,sizeof是个编译器支持的取类型大小的关键字,不是函数调用,
它没有代码,反汇编也没用。sizeof(a)意思是a类型的大小,编译器变异时将之替换为a类型大小,此处a是有5个整型的数组,每个整型4字节,自然sizeof(a)是20,sizeof(a[0])即类型a[0]的大小,a[0]是个整型,自然是4,sizeof(b)中b是int*,即整型指针,在Winodws32位平台上,所有指针都是4字节,既然就是4。
cxyOOOO 2004-12-12
  • 打赏
  • 举报
回复
在面向过程中,通常用这个方法传递一个数组,

void f(int b[], int arraySize);

调用
f(a, sizeof(a)/sizeof(a[0]);

sankt 2004-12-11
  • 打赏
  • 举报
回复
学习中.
关注.
蒋晟 2004-12-11
  • 打赏
  • 举报
回复
void f(int* b);
int a[]={1,2,3,4,5};
f(a);
〉以这样的方式传递,能在函数f中求出数组a的元素的个数吗?
不行,数组在传递过程中转换成了int* 类型。
蒋晟 2004-12-11
  • 打赏
  • 举报
回复
#define __countof(array) (sizeof(array)/sizeof(array[0]))
Bread_0053 2004-12-11
  • 打赏
  • 举报
回复
struct test
{
int a[6];
}
void f(struct test)
{sizeof(test.a);
}
这样可以
Tevoo 2004-12-11
  • 打赏
  • 举报
回复
void f(int* b);

int a[]={1,2,3,4,5};
f(a);

以这样的方式传递,能在函数f中求出数组a的元素的个数吗?


Tevoo 2004-12-11
  • 打赏
  • 举报
回复
谢谢大家哦。。。

又长见识了。。。

呵呵。。。
gzlucky 2004-12-11
  • 打赏
  • 举报
回复
概念错。

a 是数组,只不过你可以当指针用。但在程序中定义是一个数组,你用作指针只不过是取数组的起始位置。a在内存中是一段你定义好的连续的地址。所以sizeof返回的是定义时的大小。

b 是一个指针,在定义时就已生成的。b这个变量在内存中是一个存放指针的变量。所以sizeof返回的是指针的大小。
yangxile 2004-12-11
  • 打赏
  • 举报
回复
在c++中,只要你的参数不是以引用数组的形传递,那么传送的都将是数组的首地址,因此下面函数:
void f(int a[6]) { }
别看他传的是数组,其实它与下面的函数是等价的:
void f(int *a) { }

因此你必须将数组的长度也作为参数,传递过去,让函数知道这个数组的长度,如下:
void f(int *a, int size) { }

你也可以这样引用数组的形式传递:
void f(int (&a)[3])

这样只能以长度为3的int数组为参数,调用如下:
int b[] = {1,2,3};
f(b);
Bread_0053 2004-12-11
  • 打赏
  • 举报
回复
应该是对的,sizeof()是一个操作符,不是一个函数,应该是编译是就计算了 b的值,所以就是4了
「已注销」 2004-12-11
  • 打赏
  • 举报
回复
代码的再次改造:
int main()
{
int a[]={3,5,6,9,7};
int b = sizeof(a);
int* c = a;
b = sizeof(a);
cout <<b<<endl;
f(a);
return 0;
}
汇编代码如下:
19: int a[]={3,5,6,9,7};
004017E8 mov dword ptr [ebp-14h],3
004017EF mov dword ptr [ebp-10h],5
004017F6 mov dword ptr [ebp-0Ch],6
004017FD mov dword ptr [ebp-8],9
00401804 mov dword ptr [ebp-4],7
20: int b = sizeof(a);
0040180B mov dword ptr [ebp-18h],14h
21: int* c = a;
00401812 lea eax,[ebp-14h]
00401815 mov dword ptr [ebp-1Ch],eax
22: b = sizeof(a);
00401818 mov dword ptr [ebp-18h],14h // 跟代码的局部性有关
加载更多回复(3)

64,654

社区成员

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

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