【发布时间】:2015-01-25 14:50:41
【问题描述】:
下面是代码(用gcc编译):
#include <stdio.h>
#include<string.h>
int main()
{
char *c="hello";
printf("1) sizeof 'hello' : %d \n",sizeof("hello"));
printf("2) sizeof '*c' : %d \n",sizeof(*c));
printf("3) sizeof 'c': %d \n",sizeof(c));
printf("4) sizeof '&c' : %d \n",sizeof(&c));
printf("5) sizeof '&hello': %d \n",sizeof(&("hello")));
printf("\n");
return 0;
}
给定程序的输出:
1) sizeof 'hello' : 6
2) sizeof '*c' : 1
3) sizeof 'c': 8
4) sizeof '&c' : 8
5) sizeof '&hello': 8
所以,对于情况 1) 和 2),为什么这个输出没有问题。
但是对于其余的情况,即 3)、4) 和 5),为什么 sizeof 运算符给出 8?
据我所知,&c、c 和 &"hello" 代表相同的事物,即一组字符(即 c 指向“你好”),*c 代表单个字符(即 @ 987654329@ 指向 'h')。
那么,为什么sizeof(c) 给出的是 8 而不是 6?这个 8 是从什么计算而来的?
【问题讨论】:
-
它实际上是一个指向 char 数组第一个元素的指针,因此在 x64 架构上是 8 个字节
-
@Quest 谢谢。知道了。我忘记了 64 位拱门。因为我在在线 gcc 上运行代码并假设服务器是 32 位机器。
-
“代表同一件事”——不,它们不代表同一件事。它们指针的数值可能相同,但它们没有其他共同点。这三个指针具有相同的类型(
char *、char **和char (*)[6]),并且在概念上非常不同。 (第一个指向一个字符,第二个指向指针,第三个指向一个数组。) -
顺便说一句,使用
%d转换说明符格式化sizeof的结果是未定义的行为。%d用于int,但sizeof的值为size_t,其正确的转换说明符为%zu。