【问题标题】:Cannot understand return value of sizeof()无法理解 sizeof() 的返回值
【发布时间】:2013-03-26 02:14:24
【问题描述】:

我的代码中有这个:

int x = 4;
char* array = malloc(x*sizeof(char));
size_t arraysize = sizeof (array);
printf("arraysize: %zu\n", arraysize);

这段代码打印出来,

数组大小:8

为什么是 8 而不是 4? (因为 4*sizeof(char) = 4 * 1)

【问题讨论】:

  • @modifiablelvalue:是的,我的意思是 zu。我已经改变了它。嗯,这是我第一次被指向那个网站,谢谢你的信息!对了,你可以冷静一下,我是一名学习编程的学生,是的,这是我第一次遇到这个问题!所以再一次,冷静下来!
  • 它返回 ptr 大小。即使您将 x 值设为 1000,它也只会返回 8。

标签: c malloc


【解决方案1】:

array 是代码中的指针。 sizeof(array) 因此以 C 字节返回该指针的大小(提醒:C 的字节中可以有超过 8 位)。

所以,8 是您的指针大小。

另外,在 printf() 的格式字符串中,size_t 的正确类型说明符是 %zu

【讨论】:

  • C 的字节可以有超过 8 位? 是吗?我需要一个阅读链接
  • @GrijeshChauhan Here's one.
【解决方案2】:

array 是一个指针,因此它将是指针的大小(sizeof(void *)sizeof(char *)),而不是您可能期望的 sizeof(char)。看来你用的是64位电脑。

【讨论】:

  • 你的意思是 sizeof(*char) 是 sizeof(*void) 吗?
  • sizeof(void *)sizeof(char *) @Patashu
  • @AlexeyFrunze,几乎每次都不是 sizeof(int) 吗?异常总是存在,但通常是 sizeof(int) 或 intptr_t?我在答案中都提到了。
  • @Aniket 几乎,但不是每次/任何地方。在 x86 系统上的 64 位程序中,通常有 32 位整数和 64 位指针。
  • @AlexeyFrunze ok 编辑了我的答案并删除了对sizeof(int)的引用
【解决方案3】:

sizeof 没有返回值,因为它不是一个函数,而是一个 C 语言结构——考虑一下您可以编写不带括号的 sizeof array 的事实。作为 C 语言结构,它的价值完全基于编译时信息。它不知道你的数组有多大,只知道array 指针变量有多大。有关该主题的完整报道,请参阅http://en.wikipedia.org/wiki/Sizeof

【讨论】:

  • 你是不是想说sizeof 表达式在翻译过程中总是被评估?
【解决方案4】:

sizeof(array) 返回指针的大小。

【讨论】:

  • 仅当array 一个指针。给定char array[999];sizeof(array) 是 999。
【解决方案5】:

您正在计算整个数组的大小 (4*sizeof(char)) 但是您希望知道数组中的项目数 (4)。

你可以的

size_t arraysize = sizeof (array)/sizeof(char);

它将返回 8/2 = 4

【讨论】:

  • sizeof(char) 总是 1 - C 标准要求这样做。请参阅其他答案以获取正确答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2012-11-21
  • 2018-02-09
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多