char* 的大小是多少?

问题描述

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

sizeof(char)

sizeof(char[])

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

queue* q = createQueue(sizeof(int))

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

解决方法

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

你可以简单地写sizeof(char*)

https://onlinegdb.com/ySTtpNFSg

,

指针类型并没有什么神奇之处——指针的大小与任何其他对象类型一样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 这样的常见平台上,所有指针类型都具有相同的大小,但这不是必需的。
,

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

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

,

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;
}