【问题标题】:How is C sizeof() returning these valuesC sizeof() 如何返回这些值
【发布时间】:2015-05-17 22:15:29
【问题描述】:

我有下面的代码来尝试理解 C 下的内存分配。该行旁边的 cmets 表示我得到的输出。不过,除了出现的字符大小之外,我很困惑。这是输出标准吗?如果是这样,这些回报是怎么来的?


char *pk[] = {"12", "34", "56"};
int w[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*ppw)[2][3] = &w;

char ch = "a";
int in = 10;

int i = sizeof(ch);
printf("SIZE OF CHAR IS %d\n",i); //1

i = sizeof(in);
printf("SIZE OF INT IS %d\n\n",i); //4

int n = sizeof(pk);
printf("%d\n",n); //24

n = sizeof(*pk);
printf("%d\n",n); //8

n = sizeof(**pk);
printf("%d\n",n); //1

n = sizeof(ppw);
printf("%d\n",n); //8

n = sizeof(*ppw);
printf("%d\n",n); //24

n = sizeof(**ppw); 
printf("%d\n",n); //12

【问题讨论】:

  • 先去读维基百科
  • char ch = "a"; 没有做你想做的事
  • 所有这些尺寸对我来说似乎都是正确的,你应该修正这一行:char ch = "a"; 应该是 char ch = 'a';
  • 您是否熟悉数据的二进制表示(字节、字等)。
  • 不,这个输出不是标准的。但是非常符合它。除了char ch = "a" 应该生成错误消息或实际上至少是一个警告)。让我猜猜:那是一个 32 位整数的 64 位操作系统?顺便提一句。 sizeof(char) 总是返回 1。这个实际上是由标准定义的。您有具体问题吗?

标签: c arrays pointers sizeof


【解决方案1】:

您的系统有 8 字节指针和 4 字节整数。请记住,*p 表示 p[0]

sizeof(pk) 是 3 个指针数组的大小 = 24

sizeof(*pk) 是数组中第一个指针的大小 = 8

sizeof(**pk) 是 sizeof(char) 即1

sizeof(ppw) 是指针的大小 = 8

sizeof(*ppw) 是一个整数数组 (3x2) 的大小 = 6 个整数 = 24

sizeof(**ppw) 是整数数组 (3) 的大小 = 3 个整数 = 12

【讨论】:

  • 这是完美的谢谢。被 8 字节指针(没有意识到 32 位和 64 位之间的区别)和“三个指针的数组”而不是“三个字符的数组”所抛弃。
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多