gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:24 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com