首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的sizeof()函数

C语言中的sizeof()函数
EN

Stack Overflow用户
提问于 2013-07-18 00:09:43
回答 4查看 72.4K关注 0票数 2
代码语言:javascript
复制
main()
{
char a[] = "Visual C++";
char *b = "Visual C++";
printf("\n %d %d",sizeof(a),sizeof(b));
printf("\n %d %d",sizeof(*a),sizeof(*b));
}

sizeof(a)给出了输出:11 (即字符串的长度)

为甚麽呢?

为什么输出sizeof(a)=4,因为当我尝试打印a时,它给我一个地址值,因此是一个整数?

EN

回答 4

Stack Overflow用户

发布于 2013-07-18 00:20:34

每当您在程序中引用数组的名称时,它通常会衰减为指向数组的第一个元素的指针。此规则的一个例外是sizeof运算符。因此,当您考虑以下代码时。

代码语言:javascript
复制
int main()
{
   char a[] = "Visual C++";
   printf("sizeof(a)=%d\n",sizeof(a)); /* Here sizeof(a) indicates sizeof array */
   printf("a=%p",a); /* Here the array name, passed as an argument to printf decays into a pointer of type (char *) */
   return 0;
}
票数 10
EN

Stack Overflow用户

发布于 2013-07-18 00:23:05

在声明char a[] = "Visual C++"中,a是一个由11个char组成的数组。所以它的大小是11个字节。

char *b = "Visual C++"声明中,b是指向char的指针。因此它的大小是4个字节(在您正在使用的C实现中)。

在expression printf("%s", a)中,a也是一个数组。但是,它会自动转换为指向数组第一个元素的指针。因此,将指向char的指针传递给printf

除非数组是&sizeof_Alignof的参数,或者是用于初始化char数组的字符串文字,否则此转换会自动发生。因为它是自动发生的,所以人们倾向于将数组名称视为指针。然而,他们不是。

顺便说一下,sizeof是一个运算符,而不是一个函数。

票数 3
EN

Stack Overflow用户

发布于 2013-07-18 00:22:26

当sizeof应用于静态数组(不是通过malloc分配的数组)的名称时,结果是整个数组的字节大小。这是数组名称转换为指向数组第一个元素的指针这一规则的少数例外之一,这是因为实际数组大小在编译时是固定的,并且在计算sizeof运算符时是已知的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17704923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档