c语言 - 字符*的大小是多少?



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所在的内存位置的数字。我想补充一点,实际大小可能取决于此处提到的计算机的体系结构。

有关类型大小的进一步参考,请参阅 cpp首选项网站的此链接。

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

相关内容

  • 没有找到相关文章

最新更新