user-0 提问: sizeof的问题

回复:
user: user-1
content: 引用 56 楼 china_ssl 的回复:现在一般浏览器中int都是4byte的你数组中有100个元素所以大小是4*100 第三个我也没看明白 和浏览器没什么关系  第三个是vc bug

user: user-2
content: 现在一般浏览器中int都是4byte的你数组中有100个元素所以大小是4*100 第三个我也没看明白

user: user-3
content: 哇。。回帖好多啊。。。看来大家都知道了

user: user-4
content: 引用 52 楼 lpcads 的回复:[quote=引用 36 楼 u011169549 的回复:] 首先30楼的回答基本正确 1.a[100]数组下表访问已越界，但是对于c语言不会进行差错。因此可以编译运行。 2.数组的定义例如int a[100]实际上在编译器或者说是计算机看来是int[100] a，即int[100]类型的变量a，或者可以理解为是没有数组这个概念的。 3.sizeof（a）计算a的大小，也就是400。 4.第三个 sizeof（&a）表示对数组a取地址，即指针类型，所以sizeof（type*） =  sizeof (int[100]*) = 400。 至于其他编译器和系统，相信聪明的楼主会在其他编译器上类比理解的。  第一个也不要误人子弟。。。 sizeof(x)又不是函数，它只关心x的数据类型，给出数据大小，才不会管x的值到底是多少、越不越界。 [/quote] 如果是变量长度数组呢？ void f (int n) {     printf("%d\n", sizeof (  float [n] ) );     /* ...... */ }

user: user-5
content: 1.对所有指针sizeof的值都是4    &a也是4    2. sizeof(a[100])=4； 可以这么写，sizeof关键字并不对这个表达式求值      也就是说并没有取a[100]的值    只是简单的类型大小检查

user: user-6
content: 学习了学习了。

user: user-4
content: 数组名是该数组首个元素的指针，也就是说a是一个指向数组首元素的指针，对指针使用sizeof（）操作将会返回指针所指向的空间的大小，在这里也就是数组的大小，4*100  --------------------------------------------------------------------------------------------------- 这个回答有三个地方很荒谬： 1，数组名并非总是首个元素的指针。“除非是作为sizeof和一元&运算符的操作数，数组名将被转换为指向其首元素的指针”。 2，sizeof ( )操作？sizeof是运算符，但sizeof ( )不是。括号是用于包住类型名，而不是运算符的一部分； 3，对指针使用sizeof会返回“所指向空间的大小”？头一次听说。指针有指针有大小，它和指向的空间大小不相干吧？这sizeof管得也太宽了。

user: user-7
content: 引用 36 楼 u011169549 的回复:首先30楼的回答基本正确 1.a[100]数组下表访问已越界，但是对于c语言不会进行差错。因此可以编译运行。 2.数组的定义例如int a[100]实际上在编译器或者说是计算机看来是int[100] a，即int[100]类型的变量a，或者可以理解为是没有数组这个概念的。 3.sizeof（a）计算a的大小，也就是400。 4.第三个 sizeof（&a）表示对数组a取地址，即指针类型，所以sizeof（type*） =  sizeof (int[100]*) = 400。 至于其他编译器和系统，相信聪明的楼主会在其他编译器上类比理解的。  第一个也不要误人子弟。。。 sizeof(x)又不是函数，它只关心x的数据类型，给出数据大小，才不会管x的值到底是多少、越不越界。

user: user-8
content: 名称       类型 a            int [100] a[100]    int &a          int [100]* &a[0]      int * 这样就一目了然了

user: user-9
content: 数组名是该数组首个元素的指针，也就是说a是一个指向数组首元素的指针，对指针使用sizeof（）操作将会返回指针所指向的空间的大小，在这里也就是数组的大小，4*100

user: user-4
content: ,&a和a是等价的，所以sizefo(&a)等价sizeof(&a)。 ---------------------------------------------------------------- 考虑 int a [100]; &a的类型是int (*) [100]，它怎么会和a等价？

user: user-10
content: int a[100] ;   	printf("sizeof(a)=%d\n", sizeof(a)); 	printf("sizeof(a[100])=%d\n", sizeof(a[100])); 	printf("sizeof(&a)=%d\n", sizeof(&a)); 	printf("sizeof(&a[0])=%d\n", sizeof(&a[0]));  第一个不解释，返回数组所占内存的大小，第二个，a[100]不检查数组越界 sizeof(a[100])相当于sizeof(int)，所以返回值是4. 至于sizeof(&a),在只是在很久以前不是编译不通过的，以为数组名a不是一个对象，不像指针可以在内存里面找到对应地址，数组名a在内训里面是不存在的。为了保证对象完整性，后来允许使用&a，不过这里可以不是取地址的意思，而是引用数组a,&a和a是等价的，所以sizefo(&a)等价sizeof(&a)。 ----------------------------------------------------------------------------------------------------------------------------------------------------- 数组地址和对数组取地址的区别参考下面文章 http://blog.csdn.net/daniel_ice/article/details/6857019

user: user-4
content: 这个问题居然还能引起这么热烈的讨论，匪夷所思……导致大家争论的原因其实是两方面的：1，很多C的实现未采用新的标准；2，指针和int类型以字节为单位的长度是实现定义的。 sizeof(a));              //等效于sizeof (int [100])，结果是100*(int类型的大小)。 sizeof(a[100]));      //等效于sizeof (int)，结果取决于int类型的大小。 sizeof(&a));            //等效于sizeof (int (*) [100])，结果取决于指针类型的大小。 sizeof(&a[0]));        //等效于sizeof (int *)，结果取决于指针类型的大小。 版主居然让大家上机实验……汗……

user: user-11
content: 楼上解释得很清楚，~~~~~，，弄懂这几个例子，，sizeof 基本上会用了

user: user-12
content: 引用 40 楼 lin5161678 的回复:[quote=引用 39 楼 u011169549 的回复:] 楼主的运行环境是vc6.0我是基于编译器解释的，没有错误。至于你说的无论怎样都是地址码，我感觉在vc底下并不一定成立。&a的&在此编译器中表示为引用，注意编译器是vc++...不多说了自己去想。 至于其他编译器另有解释。胡说八道  sizeof &数组名 得到不是一个指针大小 那就是一个BUG   &a的一元运算符& 在C++ 一样表示 得到一个指向操作数的指针  写在声明的时候 &才有引用的意义[/quote]  所言极是，即使C++里将&作用拓展了，但是声明引用的时候必须有初始化。所以在其它地方看到&都解释为取地址

user: user-13
content: lz可以看看这个——http://blog.csdn.net/sword_8367/article/details/4868283

user: user-14
content: 第三个结果的问题是VC6的BUG

user: user-15
content: 1）VC6 确实不是很标准 2） VC6 把sizeof(&a) 当成        int (&r)[100] =a;         sizeof(r ) 来处理了，确实比较奇怪。。

user: user-16
content: 我的结果是

user: user-17
content: sizeof表示的是数据类型长度