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)
。
void
是一个无法完成的不完整类型 - 您无法创建void
类型的对象,严格来说,该类型没有大小。 但是,您可以创建void *
类型的对象,其大小和对齐方式将与char *
相同。void *
是"泛型"指针类型,无需显式强制转换即可转换为其他指针类型。 由于没有void
对象这样的东西,因此不能取消引用void *
- 必须先将其转换为另一种指针类型。- 在 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;
}