编程C 开发者

如何在 C 中处理字符串?请解释字符数组和字符串指针之间的区别。如何避免字符串操作中的错误?

用 Hintsage AI 助手通过面试

答案

在 C 语言中,字符串实现为以空字节 ('\0') 结尾的字符数组。字符串声明示例:

char str1[] = "hello"; // 包含 6 个字符的数组:{'h','e','l','l','o','\0'} char *str2 = "hello"; // 指向字符串字面值的指针
  • 字符数组:为每个元素分配内存,包括结束的零。数组是可更改的(如果不是 const)。
  • 字符串指针:可以指向字符串字面值(不可更改)或已分配的内存块。字符串字面值通常位于只读段中。

为了避免错误:

  • 正确管理内存(使用 mallocstrcpy,检查缓冲区大小)。
  • 不要使用字符串字面值来修改字符串。
  • 确保所有字符串都以 \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。有一次函数在控制台输出了垃圾,破坏了内存结构。