#include <stdio.h>
char *ft_strupcase(char *str);
char *ft_strupcase(char *str)
{
int i;
i = 0;
while (str[i])
{
if (str[i] >= 'a' && str[i] <= 'z')
{
str[i] -= 32;
}
i++;
}
return (str);
}
int main(void)
{
char *test = ft_strupcase("fdfFEhk");
for (int k = 0; test[k] != ' '; k++)
{
printf("%c", test[k]);
}
return (0);
}
预期结果是打印传递给函数的字符串,全部为大写字母。相反,我收到总线错误。为什么以及如何解决此问题?
在ft_strupcase()
函数中,您正在尝试修改字符串文本的内容。这会导致未定义的行为。
引用标准,C11
,第 §6.4.5/P7 章,字符串文字
[...]如果程序尝试修改这样的数组,则行为为 定义。
您收到的参数是字符串文本,不允许更改内容。为避免,您必须
- 传递可修改的内存作为实际参数。
- 在函数内部,创建一个块(需要照顾生命周期,
static
存储或通过内存分配器函数分配(,复制内容,执行修改操作并返回地址。
这是未定义的行为,因为您使用ft_strupcase
函数修改字符串文字
将代码重写为:
char source[] = "fdfFEhk";
char *test = ft_strupcase(source);
现在,您的字符串不再是字符串文字,并且每次初始化变量时都会复制到RAMsource
。因此,您已经定义了行为。