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

使用C语言双指针时出现意外段错误及异常输出问题排查

问题分析与解答

问题1:printf("\n%s", (Mat + 3)); 输出异常字符串

  • Mat 的类型是 char**,Mat + 3 计算得到的是指向数组第4个元素的指针(即 &Mat[3]),其类型为 char**。
  • printf 的 %s 格式符要求传入的参数是 char* 类型(字符串的首地址),但你传入了一个 char** 类型的值。
  • 此时 printf 会错误地将 char** 指针本身的数值当作字符串首地址去读取内存,这属于类型不匹配导致的未定义行为,因此输出乱码。
  • 正确写法应该是 *(Mat + 3)(等价于 Mat[3]),这样才是指向目标字符串的 char* 指针。

问题2:Mat[3][5] = 46; 触发段错误

  • 你在 main 中初始化的 matrix 数组,每个元素都是指向字符串字面量的指针。
  • 在C语言中,字符串字面量默认存储在程序的只读数据段(.rodata)中,操作系统会禁止对这块内存的写入操作。
  • 当你尝试修改 Mat[3][5] 时,本质是在修改只读内存中的内容,因此触发了段错误(Segmentation Fault)。
  • 如果需要可修改的二维字符结构,应该改用二维字符数组初始化,比如:
    char matrix[MAT_ROWS][MAT_COLS] = {"############", "############", /* 其余元素 */};
    

内容的提问来源于stack exchange,提问作者Francesco Bocci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:25:42