19

我有一段 C 代码,但我不明白该sizeof(...)函数是如何工作的:

#include <stdio.h>

int main(){
   const char  firstname[] = "bobby";
   const char* lastname = "eraserhead";
   printf("%lu\n", sizeof(firstname) + sizeof(lastname));
   return 0;
}

在上面的代码中,sizeof(firstname) 是 6,sizeof(lastname) 是 8。

但是bobby是 5 个字符宽和eraserhead11 个宽。我期待16

为什么 sizeof 对于字符数组和字符指针的行为不同?

任何人都可以澄清吗?

4

6 回答 6

26

firstname是一个char带有尾随0终止符的数组。lastname是一个指针。在 64 位系统上,指针为 8 字节宽。

于 2013-06-23T11:23:47.783 回答
6

sizeof数组是整个数组的大小,在“bobby”的情况下,它是 5 个字符,一个尾随\0等于 6。

sizeof指针是指针的大小,在 32 位机器中通常为 4 字节,在 64 位机器中通常为 8 字节。

于 2013-06-23T11:25:05.157 回答
4

你的第一个数组的大小是bobby\0. \0是终止符,所以是 6。

第二个大小是指针的大小,在 64 位系统中为 8 字节。它的大小不取决于分配的字符串的长度。

于 2013-06-23T11:24:52.443 回答
4

sizeof(...) 函数的工作原理

sizeof()看起来像一个函数,但它不是一个函数。一个函数在运行时计算一些东西。

sizeof()在 compile-time询问编译器它为参数分配了多少内存。BTWsizeof()不知道您稍后在运行时实际使用了多少。换句话说,您已经“硬编码”了printf示例中的参数。

为什么 sizeof 对于字符数组和字符指针的行为不同?

指针很少需要与数组相同的内存量。

通常,为指针分配的内存量与为其指针对象分配的内存量不同。

于 2020-02-09T01:14:12.327 回答
3

firstname是一个 6 的数组chars,包括'\0'字符串末尾的终止字符。这就是为什么sizeof firstname是6。

lastname是一个指向 的指针char,并且在您的系统上将具有该指针的任何大小。典型值为 4 和 8。lastname无论它指向什么(或者即使它根本没有指向任何东西),它的大小都是相同的。

于 2013-06-23T11:25:25.597 回答
2

firstname[]以空值结尾,长度加 1。

sizeof(lastname)给出指针的大小而不是实际值。

于 2013-06-23T11:25:09.277 回答