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

C语言指针概念:代码出现Segmentation Fault及乱码问题求助

代码段错误与乱码原因分析

核心问题:指针类型不匹配的隐式转换

你的代码里最关键的错误是指针类型不匹配,编译器通常会给出警告,这直接导致了后续的段错误和乱码:

char **ptr = str;  // 正确:str是指针数组,退化为char**类型的指针
char *p = str;     // 错误:str本质是char**类型,却被赋值给char*类型的变量p

str是存储char*的数组,数组名在表达式中会退化为指向数组第一个元素的指针,也就是char**类型(因为数组元素是char*)。但你把它赋值给了char*类型的p,这是不安全的隐式类型转换,后续操作完全偏离预期。

逐个解析printf的行为

  1. printf("%d\n", ptr); 和 printf("%d\n", p);
    这里只是把两个指针的值当成整数输出,所以数值相同,但ptr是char**类型,p是char*类型,二者本质完全不同,不能因为数值相同就认为等价。

  2. printf("%s \n", *ptr);
    *ptr是对char**类型指针的解引用,得到数组第一个元素str[0]——也就是字符串"apple"的首地址,%s会从这个地址开始读取字符直到\0,因此能正确输出"apple"。

  3. printf("%s\n", *p);
    p是char*类型,*p会读取p指向地址的第一个字节。但p实际存储的是数组str的地址(一个char**类型的地址值),把这个字节当成%s需要的字符串地址,属于非法内存访问,直接触发Segmentation Fault。

  4. printf("%s\n", p);
    %s要求传入字符串的首地址,但p存储的是数组str的地址,str数组里存的是"apple"的指针值(4字节或8字节的地址数据),%s会把这些字节当成ASCII字符输出,因此出现乱码,甚至可能越界读取内存。

修复方案

如果要让p的行为和ptr一致,需将p的类型改为char**:

char **p = str;

此时*p能正确获取str[0]的地址,printf("%s", *p)会输出"apple";注意printf("%s", p)仍然错误,因为p是指向指针的指针,并非字符串指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:12:20