You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:06:29