我知道你不能用普通的char来做这件事。
char line1 = "hello";
但您可以使用指向char类型的指针
来执行此操作 char* line2 = "hello";
我想知道为什么会这样,第二行代码会发生什么? 为什么第二次初始化可能? line2是否指向你好的第一个索引?它是否会创建某种数组并用hello填充它?我在一个编程类的c字符串类中使用它,我仍然对第二行代码中发生的事情感到困惑。
答案 0 :(得分:3)
编译器确保您指定的以null结尾的字符串“hello”存在于内存中,并将指针初始化为指向该字符串的开头。
答案 1 :(得分:1)
写作时
char *line1 = "something";
line1
被创建为堆栈上的指针(如果在自动作用域中)并被初始化为指向文字字符串"something"
(带有空终止符)。确切地说,"something"
字符串的类型char[10]
包含空终止符,数组decays to a pointer包含此特定实例中的第一个元素。
存储该字符串的数据是已编译的可执行文件的数据部分,它是只读(即写入它可能会触发访问冲突)。
答案 2 :(得分:1)
在C和C ++中,当你创建一个字符串文字时,会隐式创建一个类型为char[]
的变量,其中包含静态存储持续时间来保存它。该字符串将以空格终止,与C样式一致。
该行
char* line2 = "hello";
大致相当于
static char __string_literal_line2[] = "hello";
// At top of program or something
...
char * line2 = __string_literal_line2;
因此char[]
以这种方式隐式衰减为char*
。
这样做的一个问题是,在某种意义上,数组确实是“const”,并且尝试修改它是未定义的行为,但C标准明确允许您将其分配给char *
,所以那些不是const-correct的遗留代码仍然会编译,兼容C ++也允许这样做。
如果您正在进行编译时编程以利用字符串文字的“真实形式”,那么有时候非常方便。例如,在此代码示例中:
Passing constexpr objects around
class str_const {
const char * const p_;
const std::size_t sz_;
public:
template <std::size_t N>
constexpr str_const( const char( & a )[ N ] )
: p_( a ), sz_( N - 1 ) {}
...
};
str_const
对象现在可以在编译时从字符串文字构造为constexpr,它将知道字符串文字的大小,即使通常需要迭代或使用C库函数来确定那。那是因为它接收字符串文字为char[]
而不是char *
,它可以作为模板推导的一部分绑定到数组的长度。所以这些表达式是合法的,str_const
对象在编译时知道字符串的长度:
str_const("foo");
str_const("foobar");
str_const("foobarbaz");
答案 3 :(得分:0)
char test[] = "Hello" // adds H e l l o \0 in the stack
当你像f(&#34; Hello&#34;)那样做时,它会保留内存来存储H e l l O \ 0 当你这样做
char *test = "Hello";
它将Hello存储在某个地方并将测试初始化为内存情况,其中&#39; H&#39;存储。
基本上指针是4个字节的整数。您应该尝试一个程序,询问密码并验证如下:
if(password == "mypassword")
你的工作就是找到&#34; mypassword&#34;在生成的二进制文件中。