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

C语言字符串指针操作问题:转小写函数仅数组传参可正常运行

问题核心原因
  • 首先是字符串字面量的只读特性:C标准规定,双引号包裹的字符串字面量属于只读常量,存储在进程的只读数据段,你直接用char *指针指向这类常量时,后续尝试修改指针指向的内存内容会触发段错误,直接导致程序崩溃。而char str1[] = "AbCdEfGhI"的写法,是将只读段的字符串字面量拷贝到栈上的可写数组空间,所以后续修改操作可以正常执行。
  • 其次是参数传递类型错误:你定义的ft_strlowcase接收的是char *类型的参数(字符串首地址),但测试代码里调用时写的是ft_strlowcase(&str1),传入的是char **类型(指针变量自身的地址),类型完全不匹配,会导致未定义行为。正确的调用方式是直接传str1即可。
  • 补充语法错误:你注释里写的str1[] = "AbCdEfGhI"本身是非法语法,C语言仅允许在数组声明时用字符串字面量初始化,不能在后续单独给数组整体赋值。另外你的测试代码里打印描述写反了,函数执行后输出的是小写结果,不是大写。
无需malloc的实现方案

不需要使用malloc,你只要保证传入函数的指针指向可写的内存区域即可,仅用指针语法的可运行示例如下:

int main(void)
{   
    // 先声明栈上可写数组,再用指针指向它
    char buf[] = "AbCdEfGhI";
    char *str1 = buf; // 指针指向可写的栈内存
    
    printf("Original : %s\n", str1);
    ft_strlowcase(str1);
    printf("Lowercase : %s\n", str1); 
    return 0;
}

额外优化建议:你函数里的str[i] = str[i] + 32可以改成str[i] += 'a' - 'A',代码可读性更高,也兼容非ASCII编码的运行环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:48:03