在 C 语言中,字符串实现为以空字节 ('\0') 结尾的字符数组。字符串声明示例:
char str1[] = "hello"; // 包含 6 个字符的数组:{'h','e','l','l','o','\0'} char *str2 = "hello"; // 指向字符串字面值的指针
const)。为了避免错误:
malloc、strcpy,检查缓冲区大小)。\0 结尾。正确处理字符串的示例:
char buffer[100]; strcpy(buffer, "test"); // OK,buffer 可更改并且保证包含 '\0'
以下代码的执行结果是什么,会导致什么错误?
char *str = "hello"; str[0] = 'H'; printf("%s ", str);
答案: 程序会导致未定义行为,可能会发生段错误,因为字符串字面值位于只读内存区域。不能在字符串字面值的地址写入值。
故事 团队混淆了字符串数组和指向字面值的指针的概念。一个函数接受
char *output = "default";,然后执行strcpy(output, input);,这在第一次运行时导致崩溃,因为复制发生在只读内存中。
故事 在网络操作中,结果写入使用
char *buf = NULL; strcpy(buf, data);分配的缓冲区。这导致写入未初始化的内存并使应用程序崩溃。
故事 在本地化包中,团队在组件之间传递字符串时,没有确保添加了字符
\0。有一次函数在控制台输出了垃圾,破坏了内存结构。