sizeof()如何用于char*(指针变量)?

clo*_*Fan 14 c

我有一个C代码:

char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
Run Code Online (Sandbox Code Playgroud)

它回来了

20 8
Run Code Online (Sandbox Code Playgroud)

我想知道8是怎么来的,谢谢!

Nob*_*lis 22

sizeof(s1) 是内存中数组的大小,在你的情况下,20个字符,每个字节是1个字节等于20.

sizeof(s)是指针的大小.在不同的机器上,它可以是不同的尺寸.我的是4.

要在机器上测试不同的类型大小,您只需传递类型而不是类似的变量printf("%zu %zu\n", sizeof(char*), sizeof(char[20]));.

这将打印42032位机器上分别.

  • @ChandraShekhar那是因为`char* s`指向“fyc”的第一个字符。因此,如果你 printf `*s`,你会得到“fyc”的第一个字符“f”。单个字符重 1 个字节。这就是为什么你有 1 个字节。 (2认同)

Yu *_*Hao 13

sizeof(char *) 是指针的大小,因此32位机器通常为4,64位机器为8.

sizeof 另一方面,数组输出数组的大小,在这种情况下,20*sizeof(char)= 20

还有一件事,你应该使用%zusize_tprintf格式.

printf("%zu %zu\n", sizeof(s1), sizeof(s));
Run Code Online (Sandbox Code Playgroud)


Ada*_*zyk 6

8是指针的大小,地址.在64位机器上它有8个字节.


zak*_*ter 6

sizeof运营商返回的大小类型.操作数sizeof可以是类型的括号名称表达式,但在任何情况下,大小仅由操作数的类型确定.

sizeof s1因此严格等同于sizeof (char[20])并返回20.

sizeof s是严格等效于sizeof (char*)并返回指针的大小char(在您的情况下为64位).

如果你想要指向的C字符串的长度s,你可以使用strlen(s).

  • @alk 我的意思是`sizeof` 运算符要么应用于*表达式*,要么应用于带括号的类型名称。当它应用于表达式时,编译器使用从该表达式推断的类型来确定 `sizeof` 的值。表达式是变量或文字这一事实无关紧要,因为它只是使用的表达式的类型,而不是值。我将重新表述以使我的观点更清楚。 (2认同)