【问题标题】:assigning elements of c-string分配 c-string 的元素
【发布时间】:2015-12-31 13:12:16
【问题描述】:

我正在尝试对 c 字符串进行冒泡排序 - 请参见下面的函数。目的是根据 ASCII 码对字符进行排序。

编译器直到运行时才会抱怨,此时我遇到了分段错误。我已经运行了 gdb,程序运行良好,直到第 12 行。在第 12 行,gdb 调试器声明“进程 gdb-inferior 已被杀死”。

为什么第 12 行不正确?我在程序的其他地方遇到过这个问题 - 无法将字符分配给 c 字符串的元素。我知道 strcpy() 是字符串分配所需要的,但是对于特定的元素,我认为没问题。非常感谢任何帮助。

    1. void bubblesort(char *str)
    2. {
    3.   int length = strlen(str);
    4.
    5.   for (int i = length - 1; i > 0; i--)
    6.     {
    7.       for (int j = 0; j < i; j++)
    8.         {
    9.           if (str[j] > str[j + 1])
    10.            {
    11.              char temp = str[j + 1];
    12.              str[j + 1] = str[j];
    13.              str[j] = temp;
    14.            }
    15.         }
    16.     }
    17.   return;
    18. }

【问题讨论】:

  • 你是怎么打电话给bubblesort的?
  • @Yu Hao 我这样调用bubblesort: bool anagram(char *str1, char *str2) { // 根据ASCII码对两个数组进行排序 bubblesort(str1);冒泡排序(str2); // 对两个数组调用 compare if (compare(str1, str2)) return true;否则返回假; }

标签: c variable-assignment element bubble-sort c-strings


【解决方案1】:

我已经测试了您的代码,它运行良好。关于为什么您的代码 sn-p 不起作用,我确实有 2 个理论。

理论一:你正在尝试写入一个字符串文字,这需要这样一行:

char* str = "abc";

您的操作系统很有可能将“abc”放在单独的只读页面中,当您在 12 处写入变量时,这将导致 SEGFAULT。

更多信息在这里:Why do I get a segmentation fault when writing to a string initialized with "char *s" but not "char s[]"?

理论2:

错误很可能出现在需要以空字符结尾的字符串的 strlen 函数中。例如,免费 BSD 版本如下所示:

size_t strlen(const char * str)
{
    const char *s;
    for (s = str; *s; ++s) {}
    return(s - str);
}

假设您将“abc”存储在内存中而没有空终止字节。 strlen 将查找字母“c”,直到找到单个 \0 (0x00) 字节。此内存可以只读,在这种情况下,当您尝试写入时,会在第 12 行创建 SEGFAULT。 (所有以前的访问都是只读的)

【讨论】:

    【解决方案2】:

    我想我解决了我自己的问题...

    当调用这样的函数时:

    foo("一些字符串");

    假设 foo() 的定义形式为:

    foo(char *str){.......}

    将给出“弃用转换”警告。这很烦人,但可以忽略,除非你想在函数 foo 中修改 str。自动转换将“一些字符串”转换为 CONSTANT 字符指针而不是常规字符指针。无论您在声明/定义中编写 foo(char *str) 还是 foo(const char *str) 都会执行此操作 - 如果您编写前者,它只会发出警告。

    总之,在这种情况下,最好写成 foo(const char *str),如果 str 必须在函数中修改,那么应该在 foo 函数中创建变量的副本。

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 2012-07-21
      • 2018-01-19
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多