为啥指针不继承字符串文字的固定大小

Posted

技术标签:

【中文标题】为啥指针不继承字符串文字的固定大小【英文标题】:Why does a pointer not inherit the fixed size of a string literal为什么指针不继承字符串文字的固定大小 【发布时间】:2019-05-04 19:25:31 【问题描述】:

sizeof 关键字应用于文字而不是指针初始化到另一个文字时,我在这里缺少什么隐藏功能吗?

#include <iostream>

int main(int argc, char* argv[]) 
    const char* string = "Hello, World!";

    // sizeof(...) on literal; returns 14 (the actual length)
    std::cout << "sizeof (with literal): " << sizeof("Hello, World!") << std::endl;

    // sizeof(...) on initiated pointer; returns 4 (wonder why?)
    std::cout << "sizeof (with variable): " << sizeof(string) << std::endl;

    return 0;

还是只是我的编译器“优化”源?


question here 似乎回答了我的问题,但只是部分

提供的答案说明 C++ 无法将整个数组作为函数参数传递,因此将数组参数作为指针接收 (从逻辑上讲,参数指针可以是任意大小)。

我可以在这里猜测 literal 可能已优化为 固定大小的数组,而 指针 有一个 任意大小在编译时,但问题是:为什么


如果变量未初始化,我会更容易理解这一点:char* string; // Arbitrary size that's mutable (usually 4 bytes)

但在这种情况下,当它启动为固定大小的文字时:const char* string = "Hello, World!"; // Fixed-size of 14 allocated to variable?

在初始化中指定了变量的所有有效字符后(隐含地通过初始化的字符数给出长度),这不会使变量继承分配的文字大小?

【问题讨论】:

字符串字面量的类型是const char[N] 而不是const char * 来源:en.cppreference.com/w/cpp/language/string_literal Sizeof string literal的可能重复 @user4581301 在问题中没有std::strings。 我很抱歉。我看错了。 【参考方案1】:

我可以在这里猜测,文字可能已优化为固定大小的数组

文字没有“优化”为固定大小的数组。字符串文字固定大小的数组:这不是优化问题。

并且指针在编译时具有任意大小

不清楚您所说的“任意”是什么意思。数据指针的大小由目标系统决定。例如,在 64 位 x86 系统上,指针的大小为 8 字节。

const char* string = "Hello, World!"; // Fixed-size of 14 allocated to variable?

指针指向的内容不影响指针的大小。

这不会使变量继承分配的文字大小吗?

唯一影响变量大小的是变量的类型。如果变量的类型是const char*,则该变量的大小与sizeof(const char*)完全相同。

【讨论】:

【参考方案2】:

指针就是指针,它的大小就是指针的大小,不管它指向什么。初始化一个指向字符串字面量的指针不会改变这一点——它仍然是一个指针。

不要将数组和指针混为一谈。他们是两个不同的东西。在大多数情况下,数组的名称会衰减为指向其第一个元素的指针,这常常使初学者感到困惑。数组名称不会衰减为指针的情况之一是名称是 sizeof 运算符的参数。这就是为什么sizeof “abcdef” 是 7 而不是指针的大小。

【讨论】:

以上是关于为啥指针不继承字符串文字的固定大小的主要内容,如果未能解决你的问题,请参考以下文章

为啥修改指向字符串文字的指针的内容是错误的?

为啥新的 Visual Studio 将字符串文字作为指向常量的指针?

为啥字符串函数有一些参数作为 const char *(指向常量字符的指针)?

C指针:指向一个固定大小的数组

为啥将地址右移三位作为固定大小哈希表的哈希函数?

大小不固定的图片和多行文字的垂直水平居中