c - 将 ascii 值添加到数组字符时出现总线错误。为什么? (C)

标签 c string

<分区>

#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] != '\0'; k++)
    {
        printf("%c", test[k]);
    }
    return (0);
}

预期的结果是打印传递给函数的字符串,全部为大写字母。相反,我得到一个总线错误。为什么以及如何解决这个问题?

最佳答案

在您的 ft_strupcase() 函数中,您试图修改 string literal 的内容.这导致 undefined behavior .

引用标准,C11,章节 §6.4.5/P7,字符串文字

[...] If the program attempts to modify such an array, the behavior is undefined.

您收到的参数是一个字符串文字,您不能更改内容。为了避免,您必须要么

  • 将可修改的内存作为实际参数传递。
  • 在函数内部,创建一个 block (需要注意生命周期,静态存储或通过内存分配器函数分配),复制内容,执行修改操作并返回地址。

关于c - 将 ascii 值添加到数组字符时出现总线错误。为什么? (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44900018/

相关文章:

c++ - OpenCL 编译器异常情况

c - 给定一个 %hhu 和一个输入 1025,哪一部分映射到一个无符号字符?

mysql - 使用 sprintf(),MySQL C API 将 mysql_fetch_row() 输出保存到字符串数组中

c - 以标准格式打印名称

c - 使用 CMake 安装附加文件

C,结构中的枚举,错误C2016,头文件

android - android中的随机联系人

java - 在 Java 中更改字符串值

c++ - 如何将 UTF-8 std::string 转换为 UTF-16 std::wstring?

android - 如何将数据传递给广播接收器?