【问题标题】:Does sizeof returns the amount of memory allocated?sizeof 是否返回分配的内存量?
【发布时间】:2020-08-19 22:56:09
【问题描述】:

我读到了:

sizeof 运算符返回数据类型的大小,而不是分配给变量的内存量。

分配的内存量不是取决于数据类型的大小吗?我的意思是当我将int 传递给sizeof 时,sizeof 将返回 4(architecture-dependent)。

我在这里遗漏了什么吗?

【问题讨论】:

  • int *foo = malloc(1000); 之后分配的内存sizeof --- sizeof foo == sizeof (int*)sizeof *foo == sizeof (int) 返回。另请注意,指针的大小不一定与 int 的大小相同(因为它似乎在您的实现中)。
  • 你在哪里读到的?
  • @Niraj Raut 为对象分配的内存由其类型定义。
  • 您引用的语句可能是在使用malloc 的上下文中做出的,而在char *x = malloc(n) 之后,表达式sizeof(x) 将不会返回n。但是当然sizeof(x)字节被分配来存储指针本身。
  • @pmg 您的示例没有意义,并且与 sizeof 运算符没有任何共同之处。

标签: c memory types sizeof


【解决方案1】:

sizeof 返回变量或堆栈分配的数组占用的字节数。

例子:

  • sizeof(char)=1(在大多数配置中)
  • 但是sizeof(char*)=8(取决于平台)
  • 如果您使用malloc 动态分配内存,您将收到指向该内存块的指针。如果在上面使用sizeof,你将得到指针的大小。
  • 但是,sizeof() 一个堆栈分配的数组就像你写int a[10] 时分配的内存大小(所以 4*10)

指针的大小不取决于它所代表的数据类型的大小。 (在 32 位平台上,指针是 32 位的)

【讨论】:

  • in most configurations C 标准要求 sizeof(char) 为 1。
  • "sizeof(char) 应始终为 1。"
  • "指针的大小不依赖于它所代表的数据类型的大小。" --> 不完全是。在限制范围内,指针的大小可以随类型而变化。指向函数的指针与void * 的大小不同是很常见的。
  • "在 32 位平台上,指针是 32 位的" --> 32-通常是原生 int/unsigned 的大小,而不是普通指针。指针宽度有一种趋势是跟踪处理器n,但 C 没有指定它,并且已经/确实发生了各种异常。
【解决方案2】:

您引用的文字在技术上不正确。 sizeof variable_name 确实返回名为 variable_name 的变量占用的内存大小。

文本犯了一个常见的错误,即将指针与其指向的内存混为一谈。这是两个不同的东西。如果指针指向已分配的块,则该块不分配给指针。 (块的内容也没有存储在指针中——另一个常见的错误)。

分配本身就存在,指针变量存在于别处,指针变量指向分配。可以将指针变量更改为指向其他地方而不会干扰分配。

【讨论】:

  • 正是我的想法。
  • 现在,这与问题无关,但请回答。为什么char *argv[]char **argv在函数参数的情况下是同一个东西?
  • @NirajRaut 你不应该在 cmets 中提出新问题。如果您在此网站上搜索这些术语,您应该会找到答案
【解决方案3】:

sizeof 返回字节数

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。

但是每个字节的大小不保证是8,所以不能直接获取分配的内存量。

一个字节由一个连续的位序列组成,位的个数由实现定义

无论如何你可以使用 CHAR_BIT 常量来推断分配的内存量,其中包含的位数是一个字节。

【讨论】:

  • 谢谢,我不知道,我会相应地更正答案
【解决方案4】:

内存分配”在 C 中通常是指显式分配(即:在堆上 - malloc() 和朋友),或隐式分配(即:在堆栈上)。

正如您所定义的,sizeof() 返回数据类型的大小:

  • sizeof(char) - 单个char
  • sizeof(void *) - 一个 void 指针

如果您调用 malloc(sizeof(int)),您正在请求“足够的内存来保存 int 的数据”,这在您的系统上可能是 4 个字节...您可能会发现分配的内存比您请求的多(尽管这通常对您隐藏,请参阅canaries)。

此外,如果您调用int *x = malloc(1024)sizeof(*x),您可能会得到4,因为int 恰好是4 个字节......即使您分配的内存是1 KiB。如果您错误地调用sizeof(x),那么您将获得返回的指针的大小,而不是它指向的类型的大小。这些(sizeof(*x)sizeof(x))都不会返回 1024

【讨论】:

  • 我很想知道为什么我的答案是错误的,但我也不想为此争吵......
  • 在这个声明中 int *x = malloc(1024) 动态分配的内存与任何对象都没有任何共同之处。每个对象都由其类型定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多