业务情景1
先来看以下代码的定义是否有错误
unsigned char iv[10] = "0123456789"
输出
error: initializer-string for array of chars is too long [-fpermissive]
为什么会错误呢?明明数组长度是10,字符串长度也是10,应该刚刚好才对啊!
问题就出在字符串的终止字符也占一个字节。
"0123456789" 应当占11个字节。字符串最后还要添加转义字符。
正确的定义:
//方式一:
unsigned char iv[11] = "0123456789" ;//方式二:
unsigned char iv[] = "0123456789" ;
业务情景2
在 C 语言中,字符串是以 空字符 \0 作为终止符的(即字符串的结尾必须是 \0)。如果字符串没有终止符,printf、strlen 等字符串处理函数会无法判断字符串的结束位置,从而导致 越界访问,读取到内存中无关的垃圾数据,直到意外遇到 \0 才停止。
示例代码:
#include <stdio.h>int main() {// 情况1:正常字符串(带终止符\0)char str1[] = "hello"; // 等价于 {'h','e','l','l','o','\0'},自动添加\0printf("正常字符串: %s\n", str1);// 情况2:无终止符的字符串(手动初始化,不添加\0)char str2[5] = {'w', 'o', 'r', 'l', 'd'}; // 长度为5,没有\0printf("无终止符的字符串: %s\n", str2);return 0;
}
输出结果
正常字符串: hello
无终止符的字符串: world�8� // 末尾多出随机垃圾字符
原因分析:
1.str1 是正常字符串,编译器会自动在末尾添加 \0,printf 遇到 \0 后停止输出,结果正确。
2.str2 没有终止符,printf 会从 str2 的首地址开始读取,直到在内存中随机位置遇到 \0 才停止。因此输出结果会包含 str2 的有效字符(world),后面跟着内存中无关的垃圾数据.
注意
这种越界访问属于 未定义行为,可能导致程序崩溃或数据泄露,实际开发中必须确保字符串以 \0 结尾。
若需手动初始化字符串,需显式添加 \0,例如:char str2[6] = {'w','o','r','l','d','\0'};。
