分段故障问题:

时间:2017-12-04 00:50:50

标签: c segmentation-fault

我一直在寻找这个问题的位置,似乎无法找到它/必须忽略一些东西。任何帮助将不胜感激。

#define MAX_LETTERS 26

char alphabet[MAX_LETTERS];

void initialize_alphabet(char *a) {
  char *p;
  char current_letter = 'a';
  for (p=a;p<(a+MAX_LETTERS);p++) {
    *p = current_letter++;
  }
}

void reverse_print_alpha(char *b) {
  static var = 0;
  char *p;
  var?(p=NULL):(p=b);
  var ^= 1;
  initialize_alphabet(p);
  for (p=(b+MAX_LETTERS-1);p>=b;p--) {
    printf("%c",*p);
  }
  printf("\n");
}

int main(void) {
  int i = 0;
  while (i++<10) {
    reverse_print_alpha(alphabet);
  }
}

2 个答案:

答案 0 :(得分:2)

我看到你至少有两个问题。

1)您永远不会在主要功能中将int i初始化为0。如果你使用for循环而不是在那里使用for循环,那么循环会更明确。在这种情况下你会自己发现错误。

2)您每次迭代都会在p函数中递增*pinitialize_alphabet()。也就是说,首先它正在运行:

*p = current_character++;会将字符pcurrent_character两个点递增。其次,它正在运行:

移动指针的

p++传递了之前指向的内存。

我不明白你在任何这些函数中做了什么,因为应该是整数的变量是字符,反之亦然。我认为你可以从这些函数中脱离一步,手工编写你认为你的代码在每个循环中所做的事情,并将它与每个循环更改的实际变量进行比较,或者通过使用调试器或许多打印语句。一旦你找到了这两个分歧的地方,你就能自己解决所有问题。

答案 1 :(得分:0)

啊,我发现有人卡在C291测验8上。

之所以不起作用,部分原因是因为i,但主要是因为您没有为字母和p分配内存。默认情况下,它们都指向0x0,专用于操作系统。由于内存地址无效,因此您需要分配一个不同的内存地址。

编辑:移动主功能中的字母INSIDE的声明。