C -K R 2.4:分配时总线错误(MAC OS)



我目前正在尝试解决K R Book的练习2.4,并且遇到了一个奇怪的错误,我无法真正再现在其他地方。我正在使用:

Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

代码是:

#include <stdio.h>
#include <string.h>
/*
 * Write an alternate version of `squeeze(s1, s2)' that deletes each 
character
 * in s1 that matches any character in the string s2.
 */
void squeeze(char *s1, const char *s2);
int main(int argc, char **argv) {
  char *tests[] = {"hello", "world", "these", "are", "some", "tests"};
  for (unsigned int i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
    printf("'%s' = ", tests[i]);
    squeeze(tests[i], "aeiou");
    printf("'%s'n", tests[i]);
  }
  return 0;
}
void squeeze(char *s1, const char *s2) {
  const size_t s2len = strlen(s2);
  s1[0] = s1[0];
  unsigned int j = 0;
  for (unsigned int i = 0; s1[i] != ''; i++) {
    unsigned int k;
    for (k = 0; k < s2len; k++)
      if (s1[i] == s2[k]) break;
    if (k == s2len)  // we checked every character once, didn't find a bad char
      s1[j++] = s1[i];
  }
  s1[j] = '';
}

GDB说:

Thread 2 received signal SIGBUS, Bus error.
0x0000000100000e57 in squeeze (s1=0x100000f78 "hello", s2=0x100000fa1 
"aeiou")
at exercise2-4.c:23
23    s1[0] = s1[0];

错误最初发生在s1[j++] = s1[i]上,但我插入了s1[0] = s1[0]以独立于变量进行测试,并且也发生在此处。显然,我在这里缺少一些东西。

我正在使用clang -O0 -g -Weverything exercise2-4.c -o exercise2-4编译任何相关性。

非常感谢您的时间,对不起,如果此问题以前回答过,我还没有发现任何问题在如此奇怪的地方发生。

您可能不会更改字符串字面。任何改变字符串字面的尝试导致不确定的行为。

来自C标准(6.4.5字符串文字)

7,如果它们的阵列是否明显,则未指定 元素具有适当的值。如果程序尝试 修改这样的数组,行为不确定。

而不是字符串文字的一系列指针

char *tests[] = {"hello", "world", "these", "are", "some", "tests"};

您应该声明一个二维字符数组。例如

char tests[][6] = {"hello", "world", "these", "are", "some", "tests"};

也必须为数组的每个元素保留足够的空间,如果要附加新字符。

相关内容

  • 没有找到相关文章

最新更新