我将答案改为similar question,其中对此事进行了广泛而直接的讨论。我想确定我给他们的正确解释。
例如,我的textbook状态,在练习6.24中,“ sizeof 运算符可用于查找存储类型或表达式所需的字节数。对于数组,它不会产生数组的大小。“
#include<stdio.h>
void f(int *a);
int main(){
char s[] = "deep in the heart of texas";
char *p = "deep in the heart of texas";
int a[3];
double d[5];
printf("%s%d\n%s%d\n%s%d\n%s%d\n",
"sizeof(s) = ", sizeof(s),
"sizeof(p) = ", sizeof(p),
"sizeof(a) = ", sizeof(a),
"sizeof(d) = ", sizeof(d));
f(a);
return 0;
}
void f(int *a){
printf("In f(): sizeof(a) = %d\n", sizeof(a));
}
即便如此,对我来说这似乎并不那么明显。因此,我想简要地与您讨论输出:
sizeof(s) = 27
sizeof(p) = 8
sizeof(a) = 12
sizeof(d) = 40
In f(): sizeof(a) = 8
然后:
sizeof(s) = 27
在这种情况下,27
是由s
组成的字节数,每个char
由一个字节组成。这与sizeof
的定义形成对比,因为它返回的数组似乎是_size_of。在这一点上,我是否正确地认为char s[] = "deep in the heart of texas"
被视为表达式?
sizeof(p) = 8
在这里,我们有一个指针char *
。由于sizeof“找到存储类型所需的字节数”,我假设指针char *
存储在8个字节的内存中。我是对的吗?
sizeof(a) = 12 and In f(): sizeof(a) = 8
这个案例让我特别不确定。我发现的唯一相关差异是在f()
中,数组a
作为parameter传递:指向其基数的指针。和以前一样,指针存储在8个字节的内存中。我对么?如果是这样,12
必须被视为存储表达式int a[3]
所需的内存量?
sizeof(d) = 40
同样,它似乎返回数组d
的维度,即每个8
个字节的五个部分。但是,同样,我们不是在讨论数组,而是在考虑表达式double d[5]
。这是对的吗?
感谢您与我分享您的知识和经验!
答案 0 :(得分:2)
简言之:
1)sizeof(s) = 27
:字符串的长度,包括NUL-terminator。请注意,标准sizeof(char)
为1。
2)sizeof(p) = 8
:系统中char*
的大小。
3)sizeof(a) = 12
:在main
中,是的,数组中元素的数量乘以每个元素的大小。由此我们可以推断出sizeof(int)
是4。
4)sizeof(d) = 40
:sizeof(double)
乘以元素数量。
在函数f
中,传递的数组衰减到指针类型。最有可能sizeof(a)
为8.标准坚持 sizeof(char*)
与sizeof(int*)
相同,但我从未遇到过桌面PC情况并非如此。
答案 1 :(得分:1)
很多文字,我没有读过,但这是我的回答:
char s[] = "deep in the heart of texas"; // sizeof = length of string + 1
char *p = "deep in the heart of texas"; // sizeof is size of pointer = 8
int a[3]; // size of 3 ints
double d[5]; // size of 5 doubles
并在f
中,您正确地将其声明为获取指针,因此其大小是指针的大小。
这就是......