C语言使用二级指针访问字符串代码运行失败,如何正确实现?
代码错误点排查
- 指针类型定义错误:你将
char*类型变量x的地址赋值给了int*类型的y,类型完全不匹配。要存储char*变量的地址,需要定义对应的二级指针char**,而非int*。 - 格式化输出参数类型不匹配:
printf的%s占位符要求传入字符串首地址(类型为char*),你代码里的*(*y)是两次解引用操作,最终得到的是单个字符,把字符值当作内存地址传给%s会直接触发内存访问错误。
正确实现示例
#include <stdio.h> int main() { char *x = "abc"; // 定义二级指针存储一级指针x的地址 char **y = &x; // 输出完整字符串:仅对二级指针解引用1次,拿到字符串首地址 printf("完整字符串:%s\n", *y); // 输出单个字符:解引用2次拿到对应字符,用%c格式化 printf("第一个字符:%c\n", **y); // 访问字符串其他位置的字符 printf("第二个字符:%c\n", (*y)[1]); printf("第三个字符:%c\n", *(*y + 2)); return 0; }
原理说明
char** y的含义是:指向char*类型指针的指针,专门用来存储字符指针的内存地址- 一次解引用
*y得到的是一级指针x存储的值,也就是字符串字面量"abc"的首地址,刚好符合%s的参数要求 - 两次解引用
**y等价于*(*y),是对字符串首地址再做一次解引用,得到首地址对应的单个字符,需要用%c输出
内容的提问来源于stack exchange,提问作者user15277629
相关产品推荐
相关产品推荐

