我怎样才能证明下面 C 程序的输出是正确的?
#include <stdio.h>
char *c[] = {"Mahesh", "Ganesh", "999", "333"};
char *a;
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;
int main(void) {
printf("%d %d %d %d ",sizeof(a),sizeof(c),sizeof(cp),sizeof(cpp));
return 0;
}
打印
4 16 16 4
为什么?
Here is the ideone link如果你想摆弄它。
最佳答案
char *c[] = {"Mahesh", "Ganesh", "999", "333"};
c
是一个 char*
指针数组。初始值设定项为它指定了 4 个元素的长度,因此它的类型为 char *[4]
。该类型的大小以及 c
的大小为 4 * sizeof (char*)
。
char *a;
a
是 char*
类型的指针。
char **cp[] = {c+3, c+2, c+1, c};
cp
是一个 char**
指针数组。初始化器有 4 个元素,所以它是 char **[4]
类型。它的大小是 4 * sizeof (char**)
。
char ***cpp = cp;
cpp
是指向 char
或 char***
的指针。它的大小是sizeof (char***)
。
您的代码使用 %d
打印尺寸值。这是不正确的——但它恰好适用于您的系统。可能 int
和 size_t
大小相同。要正确打印 size_t
值,请使用 %zu
- 或者,如果该值不是很大,您可以将其转换为 int
并使用 %d
。 (%zu
格式是在 C99 中引入的;可能仍然有一些实现不支持它。)
您获得的特定尺寸:
sizeof a == 4
sizeof c == 16
sizeof cp == 16
sizeof cpp == 4
特定于您的系统。显然您的系统使用 4 字节指针。其他系统可能有不同大小的指针; 8 个字节很常见。几乎所有系统都对所有指针类型使用相同的大小,但这并不能保证;例如,char*
可能大于 char***
。 (有些系统可能需要更多信息来指定内存中的字节位置而不是字位置。)
(您会注意到我省略了 sizeof
表达式上的括号。这是合法的,因为 sizeof
是一个运算符,而不是一个函数;它的操作数要么是一个表达式(可能有也可能没有括号)或括号中的类型名称,如 sizeof (char*)
。)
关于c - 指针的大小,C中指向指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30291642/