MST

星途 面试题库

面试题:C++中字符常量与字符串常量初始化方式的差异

请详细阐述C++中字符常量和字符串常量的初始化方式,并举例说明两者在内存存储上有什么不同。同时,解释为什么在某些情况下,对字符常量和字符串常量的错误使用会导致程序运行错误。
11.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

字符常量初始化方式

在C++中,字符常量是用单引号括起来的单个字符。其初始化方式如下:

char ch = 'a';

这里将字符'a'赋值给变量ch

字符串常量初始化方式

字符串常量是用双引号括起来的零个或多个字符序列,并且会自动在末尾添加一个空字符'\0'。初始化方式有以下几种:

  1. 使用字符串字面量初始化字符数组
char str1[] = "hello";
  1. 使用指针指向字符串字面量
const char* str2 = "world";

这里使用const修饰指针指向的内容,因为字符串字面量是常量,不能被修改。

内存存储区别

  1. 字符常量:字符常量在内存中只占一个字节,存储的是该字符对应的ASCII码值。例如,'a'在内存中存储的是97(十进制)。
  2. 字符串常量:字符串常量在内存中占用的字节数是字符串中字符个数加上1(用于存储末尾的'\0')。例如,字符串"hello"在内存中占用6个字节,依次存储'h''e''l''l''o''\0'的ASCII码值。

错误使用导致运行错误的原因

  1. 字符常量错误使用:如果将字符常量当作字符串使用,例如试图用cout直接输出字符常量,它会输出该字符对应的ASCII码值,而不是像字符串那样按字符逐个输出。
char ch = 'a';
// 下面的输出会是97('a'的ASCII码值)
cout << ch << endl; 
  1. 字符串常量错误使用
    • 试图修改字符串字面量:当使用指针指向字符串字面量时,若试图修改其内容会导致运行错误。例如:
const char* str = "hello";
// 下面这行代码会导致编译错误,因为不能修改字符串字面量
// str[0] = 'H'; 
- **数组越界**:在处理字符串时,如果没有正确处理`'\0'`,可能会导致数组越界。例如:
char str[] = "hello";
// 错误地遍历到数组外,因为没有考虑'\0'
for (int i = 0; i <= 5; ++i) { 
    cout << str[i]; 
}

这样可能会访问到未初始化的内存,导致程序崩溃或出现未定义行为。