为啥指针不继承字符串文字的固定大小
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::string
s。
我很抱歉。我看错了。
【参考方案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 将字符串文字作为指向常量的指针?