c - 指针的大小,C中指向指针的指针

标签 c pointers sizeof

我怎样才能证明下面 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;

achar* 类型的指针。

char **cp[] = {c+3, c+2, c+1, c};

cp 是一个 char** 指针数组。初始化器有 4 个元素,所以它是 char **[4] 类型。它的大小是 4 * sizeof (char**)

char ***cpp = cp;

cpp 是指向 charchar*** 的指针。它的大小是sizeof (char***)

您的代码使用 %d 打印尺寸值。这是不正确的——但它恰好适用于您的系统。可能 intsize_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/

相关文章:

c - 求大 O 时间复杂度

c - 为什么 sizeof 在 C 中对同一个字符串返回不同的值?

c - fgets 的意外结果

c - C中使用指针的矩阵乘法

c++ - 编译和链接 C 和 C++ 文件

c - 从 C 中的指针列表中设置指针内容

c++ - 函数参数 : Pointer to array of objects

c - 使用 malloc 在运行时分配内存时出现段错误

c - 为什么 sizeof(function_name) 是 1

c - 从 va_arg 宏理解 "(sizeof(t) & (sizeof(t) - 1)) != 0"