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
相关产品推荐
相关产品推荐

