字符串大小

问题描述 投票:2回答:4

从下面的代码

#include<stdio.h>
int main()
{
    char *s;
    s="cool man army";  //here LHS and RHS are same type
    printf("ptr= %zd, normal string= %zd",sizeof(s),sizeof("cool man army"));
    return 0;
}

[schar *类型,并且"cool man army"也是char *,那么为什么输出ptr= 8, normal string= 14不同?

c pointers c-strings
4个回答
6
投票

字符串文字实际上是数组,而不是指针。 C standard的6.4.5p6节关于字符串文字的规定:

在翻译阶段7,值为零的字节或代码为附加到由字符串文字。多字节字符序列为然后用来初始化静态存储持续时间的数组和长度刚好足以包含序列。

因此,当它是sizeof运算符的操作数时,对指针的通常衰减不会发生[[not,并且您获得以字节为单位的数组大小。


0
投票
[第一个是字符指针,第二个不是。您可以使用

typeinfo标头:

看到它printf("%s %s", typeid(s).name(), typeid("cool man army").name());
看到类似的东西

Pc A14_c

您可以看到第二个是14个字符的数组。

0
投票
首先,您的代码无法在C ++中编译。在c ++模式下构建时,不能像这样删除const。

我认为错误在这里:

s="cool man army"; //here LHS and RHS are same type

它们不是同一类型。字符串文字是字符数组,并且会分解为指针。

字符串文字的类型为char const[14]。在C ++中,您可以创建对它的引用:

auto const& ref_to_literal = "cool man army"; assert(sizeof(ref_to_literal) == sizeof("cool man army")); // True!


0
投票
由于您同时用“ C”和“ C ++”标记了问题,所以我将用两种语言回答该问题。

声明

s = "cool man army";

其中s的类型为char *,仅在C中有效,在C ++中无效。在C ++中,变量s必须为const char *类型,因为该类型的字符串文字decays为该类型。只有在C中,字符串文字才会衰减为char *类型。但是,在两种语言中,字符串文字都是只读的,即使它不是C中的const

在现代64位平台上,指针通常为64位,这就是sizeof(s)为8字节(等效于64位)的原因。但是,字符串文字"cool man army"不是指针(与sizeof运算符一起使用时也不会衰减为1)。因此,它的长度是字符串的实际长度(包括终止的空字符),为14。

© www.soinside.com 2019 - 2024. All rights reserved.