当前位置: 代码网 > it编程>编程语言>C/C++ > C语言字符数组和字符串的区别是什么?一文搞懂\0的作用

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

2026年09月14日 C/C++ 我要评论
前言c语言没有字符串类型。所有字符串都是依靠:char 连续字符序列 + \0 结束符模拟实现。绝大多数字符串 bug、乱码、越界、段错误,根源只有一个:缺少 \0 结束符。一、单个字符 char(底

前言

c语言没有字符串类型

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

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

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

  • char 本质是 1 字节整型,存的是 ascii 码,字符只是显示形式。
  • 单引号 ' ':只能存一个字符,对应 %c 输出。
char c = 97; 
char c = 'a'; // 两句完全等价

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

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

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

  • %s 打印
  • strlen、strcpy、strcmp 等

没有 \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 字节。

结果:

  • 放不下 \0,丢失结束符
  • 不再是合法字符串
  • 使用 %s、strlen 一定会内存越界

正确写法:

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

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

  • 双引号包裹的都是 字符串常量
  • 原生类型:const char[n]
  • 存放位置:只读常量区,不可修改
  • 自带隐藏 \0,无需手动写

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

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

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

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

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

const char *p = "123456";
  • p 只存首地址,不拷贝数据
  • 指向只读常量区
  • 严禁修改内容(修改直接段错误)
  • 必须加 const

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

写法

性质

可否修改

是否合法字符串

'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)

相关文章:

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

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com