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

关于C语言字符串字面量、数组与char*指针的技术疑问

C语言回文判断相关问题解答

为什么strrev用不了?

strrev不是C标准库函数,只是部分编译器(比如微软MSVC)提供的非标准扩展。CodeSignal的IDE大概率用的是遵循C标准的编译器(比如GCC),所以不认这个函数。你自己写的双指针对比方案是标准C实现,兼容性拉满,完全靠谱。

字符串字面量和字符数组的区别

虽然所有字符串都是'\0'结尾的字符序列,但这俩本质上有区别:

  • 字符数组:比如char arr[] = "test";,这是在栈或全局区分配一块连续内存,把字符串内容复制进去,你可以随意修改数组里的字符(比如arr[0] = 'T'完全合法)。
  • 字符串字面量:比如char* p = "test";,这里的"test"存在程序的只读数据段里,属于常量,你不能修改它的内容(硬改会触发未定义行为,轻则崩溃,重则出现奇怪问题)。它存在的意义:
    • 简化代码:直接写字面量比手动初始化数组省事得多。
    • 节省内存:相同的字面量在程序中只会存储一份,多个指针可以指向它,避免重复占用空间。

char* inputString是数组还是指针?

char* inputString就是个指针变量,它存储的是字符数组(或字符串字面量)的首地址,本身并不是数组。

  • 当你把字符数组传给函数时,数组会自动“退化”成指向第一个元素的指针,所以函数里的inputString拿到的是数组首字符的地址。
  • 你能用inputString[i]访问元素,这是C语言的语法糖,本质和*(inputString + i)一样,都是通过指针偏移来访问内存中的字符。

挑战原题与实现代码

挑战原题

给定一个字符串,判断它是否为回文。

实现代码(修正版)

bool solution(char * inputString) {
    // 输入为字符数组,每个位置存单个字符,末尾以'\0'终止
    // inputString是指针,存储输入字符串的内存地址
    // 补充:inputString指向的是从索引0开始的数组对象
    // 函数返回布尔类型(1表示真,默认0表示假)
   int begin = 0; // 原代码漏了初始化,必须设为0,否则是随机值会出错
   int end = strlen(inputString) - 1;
   // 最后一个元素的索引是字符串长度减1,因为索引从0开始计数
   while (end > begin) {
       if (inputString[begin++] != inputString[end--]) {
           return 0;
       }
   } 
   return 1;
}

注意:原代码里begin没有初始化,会导致未定义行为,一定要补上begin = 0。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:05:19