【问题标题】:What is the size of a char*?char* 的大小是多少?
【发布时间】:2021-09-22 23:33:26
【问题描述】:

char* 的大小是多少,或者我如何获得它的大小?会不会是

sizeof(char)

sizeof(char[])

我问这个是因为我正在尝试创建一个数据结构(队列),将char* 作为其数据类型,并且对于队列的初始化/创建,我需要传入数据类型的大小作为参数。如果是整数:

queue* q = createQueue(sizeof(int))

我该如何为char* 做这样的事情?像这样的东西会起作用还是我有错误的想法?我是否需要使用char**,但我相信队列的实现需要更改,因为我正在遵循我在 GitHub 上找到的通用队列实现。

【问题讨论】:

  • 你试过sizeof(char*)吗?..
  • 拥有 sizeof(pointer) 是否有效? Tbh我只是认为这不起作用,所以我只是排除了它。但如果它是有效的,那么我猜就是这样?
  • 如果您想知道char* 的大小,这似乎是您要问的问题,那么除了sizeof(char*) 之外还有什么答案?或者你想知道char*指向的length of the string,这是另一回事吗?
  • 是的,使用sizeof判断指针的大小是有效的,所以sizeof(char *)就是你想要的。
  • Re "拥有 sizeof(pointer) 是否有效?",嗯,pointer 在 C 中没有内在意义,但如果它是指针类型的占位符,它绝对是有效的。只分配一个指针会有点奇怪,但是指针数组呢?这其实很常见。你需要知道指针的大小才能做到这一点。

标签: c pointers char sizeof


【解决方案1】:

char* 是一个指针,因此具有与任何其他指针相同的大小(int*void*...)。在 64 位 CPU 上,指针大小为 8 字节。

你可以直接写sizeof(char*)

https://onlinegdb.com/ySTtpNFSg

【讨论】:

  • Re "thus 与任何其他指针的大小相同",我不相信这是有保证的。但它在 x86/x64 上。
  • Re "在 64 位 CPU 上,指针大小为 8 字节。",我也不相信这是有保证的。
  • @ikegami,我很好奇。你有反例吗?
  • 很明显,C 标准不要求不同类型的指针大小相同,无论是否有人在这里提供示例,C 2018 6.2.5 28 中列出了有限的例外情况,其中说指向void 和字符类型的指针应具有相同的表示形式,指向兼容类型的合格或非合格版本的指针应具有相同的表示形式,所有指向结构类型的指针应具有相同的表示形式,所有指向联合类型的指针应具有相同的表示形式代表……
  • 此外,指针的大小由 C 实现决定,而不是 CPU。我使用了一个在 64 位 CPU 上具有 32 位指针的 C 实现。这个答案是正确的,sizeof (char *) 产生了指向char 的指针的大小,而在其他关于它的陈述中是错误的。
【解决方案2】:

指针类型没有什么神奇之处——指针的大小与任何其他对象类型一样1,因此使用sizeof (char *)sizeof (char) 一样有效。

指针类型的大小与实现所需的大小一样大,不同的指针类型可能有不同的大小2。同样,指针类型的内部表示可能因实现而异。

记住sizeof是一个操作符,而不是一个函数;仅当操作数是类型名称时才需要括号。此外,除非其操作数是可变长度数组,否则 sizeof 表达式在编译时计算,而不是运行时计算。同样,sizeof 只关心其操作数的类型,而不关心其值或存储方式。您可以在表达式和类型名称上使用 sizeof - malloc 的常见习语是

T *p = malloc( N * sizeof *p ); // for any type T

表达式*p 的类型为T,所以sizeof *p == sizeof (T)


  1. void 是一个无法完成的不完整类型 - 您不能创建 void 类型的对象,严格来说该类型没有大小。但是,您可以创建void * 类型的对象,其大小和对齐方式将与char * 相同。 void * 是一种“通用”指针类型,无需显式转换即可转换为其他指针类型。由于没有 void 对象这样的东西,您不能取消引用 void * - 您必须先将其转换为另一种指针类型。
  2. 在 x86 等常见平台上,所有指针类型都具有相同的大小,但这不是必需的。

【讨论】:

    【解决方案3】:

    正如在其他 cmets 中提到的,char* 是一个指针,因此它是一个引用实际 char 所在的内存位置的数字。我想补充一点,实际大小可能取决于here提到的计算机架构。

    有关类型大小的进一步参考,请参阅 cppreference 网站的this link

    【讨论】:

    【解决方案4】:

    sizeof(char*) 返回指针的大小。

    如果您正在为 x86 进行编译,则几乎可以保证为 4 个字节。
    如果您正在为 x64 进行编译,则几乎可以保证为 8 个字节。

    是的,获取指针的大小是完全有效的。虽然动态分配单个指针有点奇怪,但分配它们的数组是很常见的。例如,假设您想要通用化您的队列。你要做的第一件事就是让它成为一个指针队列。

    typedef struct {
       size_t capacity;
       size_t count;
       void **array;
       // ...
    } Queue;
    
    int Queue_init(Queue *q) {
       q->capacity = 10;
       q->array = malloc(sizeof(void*) * q->capacity);
       if (!q->array)
          return 0;
    
       q->count = 0;
       // ...
    
       return 1;
    }
    

    【讨论】:

    • 尽管有警告,“如果你正在为 x64 编译,它几乎可以保证是 8 个字节。”告诉人家不是好事。我使用了一个在 64 位 CPU 上具有 32 位指针的 C 实现。 (在指针繁重的代码中,它被配置为节省空间,从而节省时间和精力。)期望虚拟保证编写的代码会出错。只需使用char * 的实际大小,而不是假定大小。
    • @EricPostpischil 1. 我没有说“在 64 位 CPU 上” 2. 问题实际上是它的大小。不回答问题的建议已被拒绝。
    • 我的评论既没有说你说“在 64 位 CPU 上”,也没有说你不应该回答这个问题。
    • 尽管有警告,“如果你正在为 x64 编译,它几乎可以保证是 8 个字节。”告诉人家不是好事。这导致人们在他们的代码中建立假设,这是一个糟糕的工程。正如我的示例所示,C 实现在 64 位 CPU 上没有 64 位指针是有原因的。删除该语句会改善答案。
    • @EricPostpischil 但这就是问题所在。你刚才说我应该回答这个问题
    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2012-06-30
    相关资源
    最近更新 更多