使用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
相关产品推荐
相关产品推荐

