如何从char*类型指针获取字符串且不修改char *p = "cat"声明语句?
原代码问题说明
你给出的代码存在两个核心错误,导致无法正常运行:
char a = *p仅对指针p做了一次解引用,只拿到了字符串的第一个字符'c',无法获取完整字符串printf("%c", &a)存在类型不匹配问题:%c格式符期望接收char类型的字符值,你传入的是变量a的地址(char*类型),属于未定义行为,会出现输出乱码、程序崩溃等异常。
不修改char *p = "cat"前提下获取完整字符串的实现方案
因为p本身就是指向字符串字面量"cat"首地址的char*指针,且C语言中的字符串字面量默认在末尾追加\0作为结束标识,可根据你的使用场景选择对应方案:
方案1:直接读取/打印字符串
如果仅需要读取、打印字符串内容,不需要后续修改内容,直接将p传给字符串操作接口即可:
// 直接打印整个字符串 printf("%s", p);
方案2:拷贝字符串到可修改的内存空间
如果需要后续修改拿到的字符串内容(字符串字面量本身是只读的,直接修改p指向的内容会触发未定义行为),可以将p指向的字符串拷贝到栈数组或动态申请的堆空间中:
- 用栈数组存储:
#include <string.h> // 数组长度至少为字符串长度+1,预留位置存储结束符'\0' char buf[4]; strcpy(buf, p); // 后续buf中存储的就是完整的"cat",可正常读写操作
- 用动态堆内存存储:
#include <stdlib.h> #include <string.h> // 动态申请内存,长度为字符串长度+1 char *buf = (char*)malloc(strlen(p) + 1); if (buf != NULL) { strcpy(buf, p); // buf中存储的就是完整的"cat",使用完成后记得释放内存避免泄漏 free(buf); }
内容的提问来源于stack exchange,提问作者user16918038
相关产品推荐
相关产品推荐

