it编程 > 编程语言 > C/C++

C语言字符数组和字符串的区别是什么?一文搞懂\0的作用

22人参与 2026-09-14 C/C++

前言

c语言没有字符串类型

所有字符串都是依靠:char 连续字符序列 + \0 结束符模拟实现。

绝大多数字符串 bug、乱码、越界、段错误,根源只有一个:缺少 \0 结束符

一、单个字符 char(底层本质)

char c = 97; 
char c = 'a'; // 两句完全等价

二、c语言字符串唯一标准(必考核心)

合法字符串 = 连续 char 数组 + 末尾必须带 \0(ascii=0)

所有字符串函数全部依赖 \0 终止:

没有 \0 —— 就不是字符串,只是普通字符数组,使用字符串函数必然越界乱码。

三、字符数组的两种身份(最容易混淆)

1. 普通字符数组(非字符串)

无 \0,不能用 %s、strlen。

char arr[] = {'1','2','3','4','5','6'};

2. 合法字符串(带 \0)

char arr[] = {'1','2','3','4','5','6','\0'};

3. 双引号初始化(编译器自动补 \0)

char arr[] = "123456";

内存真实存储:1 2 3 4 5 6 \0,共 7 字节。

存储在栈区,内容可修改

四、经典错题深度解析

char str[6] = "123456";

这行代码错误!

原因:"123456" 是 7 字节(6字符+1隐藏\0),但数组只有 6 字节。

结果:

正确写法:

char str[7] = "123456"; 
char str[] = "123456"; // 推荐,自动计算长度

五、字符串常量 "" 完整规则

六、数组退化规则(底层核心)

字符串常量本来是数组 const char[n]绝大多数场景自动退化为指针 const char*

只有 3 种情况不退化(保留数组属性):

  1. sizeof("xxx")
  2. &"xxx"
  3. char arr[] = "xxx"; 数组初始化

七、字符串指针(只读不可改)

const char *p = "123456";

八、终极对比表(秒杀所有选择题)

写法

性质

可否修改

是否合法字符串

'a'

单个字符(1字节)

"a"

字符串常量(2字节)

不可改

char arr[]="123456"

栈字符数组

可改

char str[6]="123456"

栈数组(无\0)

可改

否(高危错误)

const char *p="123456"

常量字符串指针

不可改

九、完整可运行代码 + 标准运行结果

#include <stdio.h>
#include <string.h>

int main()
{
    // 1. 单个字符
    char c = 'a';
    printf("字符演示:%c,ascii=%d\n\n", c, c);

    // 2. 错误写法:丢失\0
    char err_str[6] = "123456";
    printf("错误写法 char[6]:sizeof=%d\n\n", sizeof(err_str));

    // 3. 正确写法1:指定长度7
    char str[7] = "123456";
    printf("正确写法 char[7]:\n");
    printf("sizeof=%d\n", sizeof(str));
    printf("strlen=%d\n\n", strlen(str));

    // 4. 正确写法2:自动推导(推荐)
    char arr[] = "123456";
    printf("正确写法 char[]:\n");
    printf("sizeof=%d\n", sizeof(arr));
    printf("strlen=%d\n\n", strlen(arr));

    // 5. 常量字符串指针
    const char *p = "123456";
    printf("常量指针 strlen=%d\n", strlen(p));

    return 0;
}

运行结果

字符演示:a,ascii=97

错误写法 char[6]:sizeof=6

正确写法 char[7]:
sizeof=7
strlen=6

正确写法 char[]:
sizeof=7
strlen=6

常量指针 strlen=6

十、全篇终极口诀(直接背)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

ubuntu虚拟机安装QT找不到图标?打开方式实现教程

09-13

MQ消息丢失怎么解决?5种方案帮你彻底搞定

09-13

C++中使用大括号初始化时需要注意哪些问题?一文总结

09-13

深入理解C++ explicit关键字

09-15

解决Matlab找不到编译器问题以及版本通用方法

09-13

matlab编译找不到C++编译器怎么办?mbuild-setup提示未检测到编译器解决方法

09-13

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论