将 ascii 值添加到数组字符时出现总线错误.为什么?(三)


#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。因此,您已经定义了行为。

相关内容

最新更新