1
#include <stdio.h>

int main(void) {

int TEST_HB[10]; 
memset(TEST_HB,'9', sizeof( TEST_HB));

printf("%c\n",TEST_HB[9]);

printf ("TEST_HB[10]=%d\n",sizeof( TEST_HB[40]));   // shows 4
printf ("Arraysize=%d\n",(sizeof(int)*10));     // gets the expectected results
return 0;

} 

我相信 sizeof (myArray) 应该以字节为单位返回数组的总大小。但是为什么sizeof( TEST_HB[40])在没有定义的时候返回 4 呢?

4

4 回答 4

7

TEST_HB[40]是一个具有类型的表达式int(如果评估,则行为未定义,因为40对于数组来说太大了)。你的实现sizeof(TEST_HB[40])的大小也是如此int:4 是典型的。

重要的是,sizeof除非它是 VLA,否则不会评估其操作数——它只使用类型。因此,即使没有TEST_HB[40].

实际上,我说它已经定义了行为,但sizeof评估为 type size_t,它没有打印%d. 在可用的地方使用%zu或查阅您的编译器文档。您在这里侥幸逃脱,因为您很幸运地使用了 varargs 调用约定,再加上与您的实现中size_t的大小相同int,或者您的实现是 little-endian,或两者兼而有之。

sizeof不计算操作数的一个相当常见的用法是编写如下内容:

struct Foo *foo = malloc(sizeof(*foo) * number_of_foos_required);

sizeof(*foo)与 相同sizeof(struct Foo),但对某些人来说,它更“明显”是使用合适的尺寸。foo在分配内存之前未初始化,因此sizeof实际上不使用foo.

一个不太常见的用法,它演示了 的行为sizeof

int i = 0;
printf("%d\n", i);
printf("%d\n", (int)(sizeof(i++))); // i++ is not executed
printf("%d\n", i);
于 2012-08-31T13:23:38.900 回答
2
sizeof( TEST_HB)

是数组的大小(的大小int[10]

sizeof(TEST_HB[40])

是数组元素的大小(的大小int)。

请注意,该元素TEST_HB[40]在您的数组中不存在(您的数组只有 10 个元素),但由于sizeof不评估其操作数,它仍然有效。

于 2012-08-31T13:24:46.670 回答
1

sizeof运算符产生其操作数的大小。如果要获取数组的大小,则应sizeof TEST_HB改为使用(不需要括号)。 TEST_HB[40]确实是类型int,而是TEST_HB类型int[10]。请注意,除了可变长度数组,运算符的操作数sizeof不会被计算,因此它不会导致未定义的行为。

C11 § 6.5.3.4 sizeof 和 _Alignof 运算符

运算符产生其sizeof操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。

此外,使用非常量大写标识符被认为是糟糕的 C 编程风格。

于 2012-08-31T13:24:12.100 回答
0

返回 int 数组第sizeof( TEST_HB[40])40 位的 int 大小,因此大小为 4 个字节。

于 2012-08-31T13:25:36.330 回答