C语言基础:4.3C风格字符串操作

【C语言核心】C风格字符串深度解析与安全编程实践

一、字符串存储原理与内存布局

1. 终止符验证实验

char valid_str[6] = {
   'H','e','l','l','o','\0'}; // 合法字符串
char invalid_str[5] = {
   'H','e','l','l','o'};    // 无终止符

printf("合法字符串长度:%zu\n", strlen(valid_str));   // 5
printf("非法字符串长度:%zu\n", strlen(invalid_str)); // 未定义行为!

// 内存布局示例:
// 地址    | 值(ASCII) | 字符
// 0x1000 | 0x48       | 'H'
// 0x1001 | 0x65       | 'e'
// 0x1002 | 0x6c       | 'l'
// 0x1003 | 0x6c       | 'l'
// 0x1004 | 0x6f       | 'o'
// 0x1005 | 0x00       | '\0'(仅valid_str有)

2. 常见初始化陷阱

// 错误示例1:数组长度不足
char str1[5] = "Hello"; // 错误!需要6字节空间

// 错误示例2:忘记分配空间
char *str2 = "Hello";
str2[0] = 'h'; // 运行时错误!字符串字面量存储在只读段

// 正确用法:
char str3[] = "Hello"; // 自动计算长度(6字节)
char str4[10] = "Hello"; // 剩余空间自动补零

二、危险函数与安全替代方案

1. 传统函数问题分析

// strcpy缓冲区溢出示例
char buf[5];
strcpy(buf, "HelloWorld"); // 越界写入!导致栈损坏

// strcat连接溢出示例
char path[8] = "/usr";
strcat(path, "/lib"); // 最终长度8+4=12,越界!

// strcmp潜在问题
char passwd[10] = "secret";
if(strcmp(passwd, input) == 0) {
    // 可能被时序攻击
    // 认证通过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵鑫亿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值