【问题标题】:How do I figure out how many bytes are used to store a variable in C using the sizeof operator?如何使用 sizeof 运算符确定用于在 C 中存储变量的字节数?
【发布时间】:2012-03-07 23:34:57
【问题描述】:

我们有以下代码:

#include <stdio.h>
#define LEN 10

int main(void) {
    int i;
    int array[LEN];
    int *p;
    for (i = 0; i < LEN; i++) {
        array[i] = i;
    }
    for (p = &array[0]; p < &array[LEN]; p++) {
        printf("Address: %p   ", p);
        printf("Value: %d\n", *p);
    }
    return 0; 
}

它要求我们找出服务器用于存储整数变量的字节数,并将其打印在换行符上,并提示我们使用 sizeof。

现在,我对指针有点菜鸟,所以这可能是一个非常快速的问题,但我应该打印:

printf("Size of int: %d", sizeof(p));

sizeof(*p)

一个打印 4,另一个打印 8。我倾向于 8(它来自简单的 p),因为它指的是内存位置,而不是它指向的变量的值,对吗?而 8 表示 8 位,那么 1 字节就是答案?

【问题讨论】:

  • 8 not 表示 8 位,表示 8 字节。
  • sizeof(p)和sizeof(*p)是有区别的,第一个是指针的大小,另一个是指针指向的大小。同意 Andrew Marshall,返回的值是字节而不是位,我不相信标准允许位作为将返回的已定义单元大小,指针的存储大小通常与 int 上的大小相同,即定义为操作系统可以有效存储并保证至少与此一样大的内容,因此通常为 4 字节(32 位)或 8 字节(64 位)。
  • 括号是多余的。拥有sizeof psizeof *p 一样好。你不会在return(0); 中使用括号吗?
  • 非常感谢,伙计们。所以只是为了确保,答案将是 4 个字节(或 32 位),因为这是整数的 sizeof 值,而不是指针?
  • 在类型上使用sizeof 时需要括号(例如sizeof(int))。有些人确实在return(0) 中使用括号。酒吧。

标签: c byte sizeof


【解决方案1】:

解决您的特定问题的一个简单方法是在类型名称上使用sizeof

sizeof(int)
sizeof(int *)

你会得到你需要的答案,不会有任何困惑。

【讨论】:

  • 哇哦,谢谢。然后快速补充问题。最初的问题要求我们根据它给出的十六进制字符串来确定大小,我将如何去做呢?例如,其中一个的字符串是 0x7fff683a1b7c。
  • 十六进制字符串?这是什么意思?
  • 抱歉,我可能不太清楚。它是这样说的:“你能说出在 bluenose 上存储一个 int 变量需要多少字节吗?为什么?”我们所要做的只是一个十六进制字符串,表示指向数组的指针地址(使用 %p)和指针指向的值。在我们这样做之后,下一个问题要求使用 sizeof。
  • 好吧,%p 使用的格式是特定于实现的,所以很遗憾不是,使用它的输出你不能保证任何事情。 大多数系统甚至不打印一个全角的零填充十六进制数字,所以在一般情况下你可能不走运。
【解决方案2】:

p 是一个指向 int 的指针,因此 sizeof(p) 给出了一个指针消耗的字节数。所以你得到的 int (你的问题)的大小

sizeof(*p)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2011-07-04
    相关资源
    最近更新 更多