C语言技术问题:读取含反斜杠字符时为何触发段错误?
问题分析与修复
你的段错误是因为对char**类型的理解出现了偏差,咱们一步步拆解问题:
错误根源
在main函数里,你定义的array是单个char*指针,用来存getline读取的单行字符串。当你把&array传给test函数时,test里的array参数是char**——但它指向的是单个char*变量,而不是一个字符串数组。
所以在test函数里:
array[0]等价于*(array + 0),能正确拿到main里的那个字符串指针(指向"{\n"),这一步没问题;- 但
array[1]等价于*(array + 1),这会去访问main里array变量之后的内存区域,属于非法越界访问,直接触发了段错误。
你真正想做的是访问字符串里的单个字符,而不是访问多个字符串指针,正确的做法是先通过*array拿到字符串指针,再用下标访问字符。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 注意:C标准里没有boolean,要包含这个头文件用bool类型 void test(char **array) { // 先拿到实际的字符串指针 char *str = *array; // 访问字符串的单个字符,注意先确认索引在有效范围内 bool a = (str[0] == '\\'); // 对应原代码的array[0] bool b = (str[1] == '\\'); // 原代码的array[2]是错误的,这里修正为字符串的第2个字符 bool c = (str[0] == '\\'); // 原代码的array[1]是越界,这里按需求调整为对应字符 // 打印验证结果 printf("a: %d, b: %d, c: %d\n", a, b, c); } int main() { FILE *messages = fopen("messages.json", "r"); if (!messages) { // 必须检查文件是否打开成功 perror("Failed to open file"); return EXIT_FAILURE; } char *array = NULL; size_t size = 0; ssize_t read_len = getline(&array, &size, messages); if (read_len == -1) { // 检查getline读取是否成功 perror("Failed to read line"); fclose(messages); free(array); return EXIT_FAILURE; } printf("Read line: %s", array); test(&array); // 清理资源,避免泄漏 free(array); fclose(messages); return EXIT_SUCCESS; }
额外注意事项
- 头文件问题:C标准中没有
boolean类型,需要包含<stdbool.h>来使用bool(或者直接用原生的_Bool),否则编译器会报错。 - 边界检查:访问字符串字符前,一定要确认索引在有效范围内(小于字符串长度),否则即使没触发段错误,也会读取到垃圾值。
- 错误处理:
fopen和getline都可能失败,必须检查它们的返回值,避免空指针访问或者资源泄漏。 - 资源释放:
getline动态分配的内存需要用free释放,打开的文件也要用fclose关闭。
内容的提问来源于stack exchange,提问作者user7948550
相关产品推荐
相关产品推荐

