22人参与 • 2026-09-14 • C/C++
c语言没有字符串类型。
所有字符串都是依靠:char 连续字符序列 + \0 结束符模拟实现。
绝大多数字符串 bug、乱码、越界、段错误,根源只有一个:缺少 \0 结束符。
char c = 97; char c = 'a'; // 两句完全等价
合法字符串 = 连续 char 数组 + 末尾必须带 \0(ascii=0)
所有字符串函数全部依赖 \0 终止:
没有 \0 —— 就不是字符串,只是普通字符数组,使用字符串函数必然越界乱码。
无 \0,不能用 %s、strlen。
char arr[] = {'1','2','3','4','5','6'};char arr[] = {'1','2','3','4','5','6','\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 种情况不退化(保留数组属性):
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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论