首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sizeof string与sizeof string指针

Sizeof string与sizeof string指针
EN

Stack Overflow用户
提问于 2021-01-16 06:28:02
回答 2查看 513关注 0票数 2

在以下代码中:

代码语言:javascript
复制
char *title = "VP";
printf("Sizeof title: %zd | Sizeof *title: %zd | Strlen: %zd\n", sizeof title, sizeof *title, strlen(title));

Sizeof标题:8\ Sizeof *标题:1小姐:2人

看起来,sizeof title对指向字符串的指针进行操作(对于我来说是8个字节),而strlen(title)可以预测地给出2。

为什么sizeof *title在取消引用指针时产生1而不是3(字符串的字节长度)?例如,为什么它要这样做,而不是它将产生什么:

代码语言:javascript
复制
printf("%zd\n", sizeof("VP"));
// 3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-16 06:32:20

指针的大小总是指针本身的大小,而不是它所指向的大小。这是因为sizeof主要是一个编译时操作符(结果由编译器计算),编译器无法知道指针在运行时可能指向什么。

至于sizeof *title,它与sizeof title[0]相同,后者是单个charchar的大小是1 (顺便说一句,它被指定为1,不管实际位宽如何)。

最后是关于sizeof "VP"。在C中,所有文字字符串实际上都是字符数组,包括终止空字符。因此,文字字符串"VP"是一个由三个字符组成的数组,因此它的大小是3

为了使答案更完整一点,我认为sizeof操作符主要是编译时。当然,对于变长阵列来说不是这样的,编译器必须插入代码来存储数组的实际大小,这样才能在运行时获取数组。如果数组衰变为指针,那么您所拥有的就是指针,sizeof再次返回指针本身的大小。

还有一个关于字符串文字数组的注释。虽然它们在技术上是非常数数组,但它们仍然不能被修改。试图修改字符串文字会导致未定义的行为。因此,文字字符串实际上是只读的.

票数 3
EN

Stack Overflow用户

发布于 2021-01-16 15:55:00

title的类型是char *,所以*title的类型是char,而不是char [3]。因此,sizeof *title等同于sizeof (char),即1。

title不是字符串,它只是指向字符串的第一个元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65747055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档